过滤递归数组,仅删除NULL值

Kri*_*dav 5 php arrays recursion multidimensional-array

我想从递归数组中删除所有null或空白值,但不删除false和0值。

function isNotNull($val) {
    if(is_array($val)) {
        $ret = array_filter($val, 'isNotNull');
        return $ret;
    } else {
        return (!is_null($val) && $val !== '');
   }

}
Run Code Online (Sandbox Code Playgroud)

$ arr = array_filter($ arr,'isNotNull');

输入:

$arr = array(
"stringKey" => "Abc",
"boolKey" => false,
"zeroKey" => 0,
"blankKey" => '',
"newArr" => array(
    "stringKey2"=>"Abc2", 
    "boolKey2"=>false, 
    "zeroKey2" => 0, 
    "blankKey2"=>"", 
    "blankArr" => array()
    )
);
Run Code Online (Sandbox Code Playgroud)

这给出了输出:

Array
(
    [stringKey] => Abc
    [boolKey] => 
    [zeroKey] => 0
    [newArr] => Array
        (
            [stringKey2] => Abc2
            [boolKey2] => 
            [zeroKey2] => 0
            [blankKey2] => 
            [blankArr] => Array
                (
                )
        )
)
Run Code Online (Sandbox Code Playgroud)

但我想吼叫输出:

 Array
(
    [stringKey] => Abc
    [boolKey] => 
    [zeroKey] => 0
    [newArr] => Array
        (
            [stringKey2] => Abc2
            [boolKey2] => 
            [zeroKey2] => 0
        )
)
Run Code Online (Sandbox Code Playgroud)

我将array_filter与回调函数一起使用,但它仅过滤简单数组,而不过滤多维数组。我不想使用循环。

Phi*_*ipp 5

您可以在递归调用函数中组合array_maparray_filter。像这样的事情可能对你有用。

function filterNotNull($array) {
    $array = array_map(function($item) {
        return is_array($item) ? filterNotNull($item) : $item;
    }, $array);
    return array_filter($array, function($item) {
        return $item !== "" && $item !== null && (!is_array($item) || count($item) > 0);
    });
}
Run Code Online (Sandbox Code Playgroud)