[英]PHP Array_filter on "simple" multi-level array
我可以以及如何使用 PHP 的array_filter
從以下數組結構中過濾空白/空條目?
From:數組來自使用 Fetch BOTH 的 PDO 調用,因此在這種情況下,數值和命名值始終相等。
Array
(
[2400] => Array
(
[0] => Array
(
[value] => 7
[0] => 7
)
[1] => Array
(
[value] => 61
[0] => 61
)
[2] => Array
(
[value] => 42
[0] => 42
)
[3] => Array
(
[value] =>
[0] =>
)
)
)
至:
Array
(
[2400] => Array
(
[0] => Array
(
[value] => 7
[0] => 7
)
[1] => Array
(
[value] => 61
[0] => 61
)
[2] => Array
(
[value] => 42
[0] => 42
)
)
)
我努力了
array_filter
array_filter(array, function($f){ ??? })
不太確定從這里去哪里...我打算對數組進行深入研究,但這將如何影響通過array_filter
的條目? 真/假返回不會帶來整個 [2400] 數組部分嗎? 它只是讓我感到困惑。請對問題提出改進建議
使用array_filter
並測試value
元素(或0
元素,因為它們是等效的)。
$array[2400] = array_filter($array[2400], function($element) {
return $element['value'];
});
要對外部數組的所有元素執行此操作,請使用foreach
循環。
foreach ($array as &$subarray) {
$subarray = array_filter($subarray, function($element) {
return $element['value'];
});
}
或array_map
:
$array = array_map(function($subarray) {
return array_filter($subarray, function($element) {
return $element['value'];
});
}, $array);
我認為僅使用array_filter
函數無法做到這一點,因為有時您需要修改數組元素,但array_filter
函數僅允許決定是否應排除該元素。
例如,索引為 2400 的主數組元素應包含在結果集中,但應修改其內容。
我寫了一個簡單的函數來做到這一點,希望它可能會有所幫助。 好吧,你可能會用這個來獲得靈感。 這對我來說也是一個有趣的挑戰。
下面是我的功能與幾個測試。
<?php
function deepFilter(array $array)
{
// Formally this is not need because if array is empty then $filteredArray will also be empty
// but it simplifies the algorithm
if (empty($array)) {
return [];
}
$filteredArray = [];
foreach ($array as $key => $value) {
if (is_array($value) && !empty($value)) {
$value = deepFilter($value);
}
if (!empty($value)) {
$filteredArray[$key] = $value;
}
}
return $filteredArray;
}
$testArray1 = [
2400 => [
0 => [
'value' => 7,
0 => 7,
],
1 => [
'value' => 61,
0 => 61,
],
2 => [
'value' => 42,
0 => 42,
],
3 => [
'value' => null,
0 => null,
]
]
];
$testArray2 = [
2400 => [
0 => [
'value' => 7,
0 => 7,
],
1 => [
'value' => 61,
0 => 61,
],
2 => [
'value' => 42,
0 => 42,
],
3 => null
],
3243 => [
0 => [
'value' => 7,
0 => null,
],
1 => [
'value' => null,
0 => 61,
],
2 => [
'value' => 42,
0 => 42,
],
3 => null
]
];
var_export(deepFilter($testArray1));
var_export(deepFilter($testArray2));
這個想法很簡單。
如果您發現任何錯誤或者它是否適合您,請告訴我。
如果數組結構保持不變,那么這應該有效:
foreach ($array as &$innerArray) {
$innerArray = array_filter($innerArray, function($arr) {
return (!empty($arr[0]));
});
}
unset($innerArray);
您可以通過array_map()
對array_filter()
進行迭代調用,從而簡潔地過濾子集數據。 您可以通過調用本機函數array_sum()
(或array_product()
)來避免為array_filter()
編寫自定義函數——這會產生正確的真/假結果,因為任何具有空值的數據集都將被計算為0
,以及其他所有內容非零(“真實”)。
代碼:(演示)
var_export(
array_map(fn($row) => array_filter($row, 'array_sum'), $array)
);
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.