递归过滤多维数组中的项目不包含数组类型数据,除非有白名单键

问题描述 投票:0回答:2

我有以下多维数组的数组:

$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'
它不起作用。

php arrays recursion multidimensional-array array-filter
2个回答
1
投票

您只想删除未命名为

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;
}

0
投票

解决方案可能比 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));
© www.soinside.com 2019 - 2024. All rights reserved.