以递归方式从多维数组中删除空元素和子数组

Chu*_*utt 18 php arrays filtering multidimensional-array is-empty

我似乎无法找到一个简单,直接的解决方案来解决从PHP中的数组中删除空元素的古老问题.

我的输入数组可能如下所示:

Array ( [0] => Array ( [Name] => [EmailAddress] => ) ) 
Run Code Online (Sandbox Code Playgroud)

(依此类推,如果有更多数据,虽然可能没有......)

如果它看起来像上面那样,我希望它在处理之后完全是空的.

那么print_r($array);输出:

Array ( )
Run Code Online (Sandbox Code Playgroud)

如果我跑,$arrayX = array_filter($arrayX);我仍然得到相同的 print_r输出.我看过的每个地方都暗示这是在PHP5中删除空数组元素的最简单方法.

我也试过,$arrayX = array_filter($arrayX,'empty_array');但我得到以下错误:

警告:array_filter()[function.array-filter]:第二个参数'empty_array'应该是一个有效的回调

我究竟做错了什么?

Wes*_*rch 30

尝试使用array_map()过滤器应用于以下每个数组$array:

$array = array_map('array_filter', $array);
$array = array_filter($array);
Run Code Online (Sandbox Code Playgroud)

演示:http://codepad.org/xfXEeApj


jer*_*ris 5

有很多如何做到这一点的例子.您可以尝试使用文档(请参阅第一条评论).

function array_filter_recursive($array, $callback = null) {
    foreach ($array as $key => & $value) {
        if (is_array($value)) {
            $value = array_filter_recursive($value, $callback);
        }
        else {
            if ( ! is_null($callback)) {
                if ( ! $callback($value)) {
                    unset($array[$key]);
                }
            }
            else {
                if ( ! (bool) $value) {
                    unset($array[$key]);
                }
            }
        }
    }
    unset($value);

    return $array;
}
Run Code Online (Sandbox Code Playgroud)

虽然这个例子实际上并没有使用,array_filter但你明白了.


Cod*_*key 5

遵循 jeremyharris 的建议,这就是我需要更改它以使其发挥作用的方式:

function array_filter_recursive($array) {
   foreach ($array as $key => &$value) {
      if (empty($value)) {
         unset($array[$key]);
      }
      else {
         if (is_array($value)) {
            $value = array_filter_recursive($value);
            if (empty($value)) {
               unset($array[$key]);
            }
         }
      }
   }

   return $array;
}
Run Code Online (Sandbox Code Playgroud)


小智 5

接受的答案并不完全符合OP的要求.如果要递归删除评估为false的所有值,包括空数组,请使用以下函数:

function array_trim($input) {
    return is_array($input) ? array_filter($input, 
        function (& $value) { return $value = array_trim($value); }
    ) : $input;
}
Run Code Online (Sandbox Code Playgroud)

或者您可以根据需要更改返回条件,例如:

{ return !is_array($value) or $value = array_trim($value); }
Run Code Online (Sandbox Code Playgroud)

如果您只想删除空数组.或者您可以将条件更改为仅测试""或false或null等...


jos*_*tgv 5

尝试使用:

$array = array_filter(array_map('array_filter', $array));
Run Code Online (Sandbox Code Playgroud)

例子:

$array[0] = array(
   'Name'=>'',
   'EmailAddress'=>'',
);
print_r($array);

$array = array_filter(array_map('array_filter', $array));

print_r($array);
Run Code Online (Sandbox Code Playgroud)

输出:

Array
(
    [0] => Array
        (
            [Name] => 
            [EmailAddress] => 
        )
)

Array
(
)
Run Code Online (Sandbox Code Playgroud)