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
有很多如何做到这一点的例子.您可以尝试使用文档(请参阅第一条评论).
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但你明白了.
遵循 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等...
尝试使用:
$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)