我有以下多维数组的数组:
$arr = [
'test' => [
'access' => 111,
'aa' => [
'access' => 222,
'bb' => 333
],
],
'access' => 444,
'value' => 555
];
想要的结果:
[
'test' => [
'access' => 111,
'aa' => [
'access' => 222,
],
],
'access' => 444,
]
我的代码:
function array_filter_recursive($input)
{
foreach ($input as &$value) {
if (is_array($value)) {
$value = array_filter_recursive($value);
}
}
return array_filter($input,function ($key){
return $key == 'access';
},ARRAY_FILTER_USE_KEY);
}
var_dump(array_filter_recursive($arr));
但是,我的代码仅返回 1 项。
如果我像
return $key != 'access';
那样更改函数,它会返回没有 key == access
的数组,但如果 $key == 'access'
它不起作用。
您只想删除未命名为
access
且值不是嵌套数组的键。这样,您就可以保留任何中间数组。
您不能使用
array_filter()
,因为它只接收值,而不接收键。因此,请在您的 foreach
循环中执行此操作。
function array_filter_recursive($input)
{
foreach ($input as $key => &$value) {
if (is_array($value)) {
$value = array_filter_recursive($value);
if (empty($value)) {
unset($input[$key]);
}
} elseif ($key != 'access') {
unset($input[$key]);
}
}
return $input;
}
解决方案可能比 Barmar 的答案更精简。
迭代时,如果遇到子数组,则递归遍历。否则,当遇到非数组且其键不是
access
时,则对其进行剪枝。
我的代码片段将使用魔法
__FUNCTION__
来避免重复冗长但指示性的函数名称带来的臃肿。
代码:(演示)
function removeIfNotArrayAndNotSiblingOfAccess($array) {
foreach ($array as $key => &$value) {
if (is_array($value)) {
$value = (__FUNCTION__)($value);
} elseif ($key != 'access') {
unset($array[$key]);
}
}
return $array;
}
var_export(removeIfNotArrayAndNotSiblingOfAccess($array));