首页 > 解决方案 > PHP array_filter 递归

问题描述

请帮我过滤数组

我有数组:

$arr=[
    'test'  =>  [
        'access'    => 111,
        'aa'        => [
            'access'=> 222,
            'bb'    => 333
            ],
        ],
    'access'    =>  444,
    'value'     =>  555
    ];

我想

$arr=[
    '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' 则它不起作用

标签: phprecursionarray-filter

解决方案


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

推荐阅读