我认为仅使用array_filter函数无法完成此操作,因为有时您需要修改数组元素,但array_filter函数只允许决定是否应该排除该元素。
例如,在主数组中,索引为2400的元素应该包含在结果集中,但是应该修改它的内容。
我写了一个简单的函数来做到这一点,希望它可能有所帮助。好吧,你可以用它来获取灵感。对我来说这也是一个有趣的挑战。
以下是我的功能测试。
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));
这个想法非常简单。
拿一个数组并逐个检查元素。
如果element是一个数组,则应用该元素的函数并检查结果。我们可以从子数组中删除所有内容,在这种情况下,我们不应该将其添加到结果中。如果孩子在清理后还剩下一些东西,包括“清洁过的孩子”等。在我们的结果集中。
如果我们的元素不是数组,那么只有在它不为空时才包含它。
醇>
如果您发现任何错误或是否适合您,请告诉我。