array_filter()
默认情况下不区分类型。这意味着任何零值、false值、null值和空值都将被删除。以下链接将证明这一点。
OP 的示例输入数组是二维的。如果数据结构是静态的,则不需要递归。如果有人想从多维数组中过滤掉零长度的值,则我将提供一个静态的二维方法和一个递归方法。
静态二维数组:
这段代码对第二层元素执行“零安全”过滤,然后删除空子数组: (查看此演示以查看此方法如何处理不同(更棘手)的数组数据)
$array=[
['Name'=>'','EmailAddress'=>'']
];
var_export(
array_filter( // remove the 2nd level in the event that all subarray elements are removed
array_map( // access/iterate 2nd level values
function($v){
return array_filter($v,'strlen'); // filter out subarray elements with zero-length values
},$array // the input array
)
)
);
这里是同样的代码,但写成了一行:
var_export(array_filter(array_map(function($v){return array_filter($v,'strlen');},$array)));
输出(如原始规定):
array (
)
*如果您不想删除空的子数组,只需删除外部的array_filter()
调用即可。
多维未知深度数组的递归方法: 当数组中的级数未知时,递归是一种合理的技术。以下代码将处理每个子数组,并在处理过程中删除零长度值和任何空的子数组。这里有一个带有几个示例输入的代码演示。
$array=[
['Name'=>'','Array'=>['Keep'=>'Keep','Drop'=>['Drop2'=>'']],'EmailAddress'=>'','Pets'=>0,'Children'=>null],
['Name'=>'','EmailAddress'=>'','FavoriteNumber'=>'0']
];
function removeEmptyValuesAndSubarrays($array){
foreach($array as $k=>&$v){
if(is_array($v)){
$v=removeEmptyValuesAndSubarrays($v);
if(!sizeof($v)){
unset($array[$k]);
}
}elseif(!strlen($v)){
unset($array[$k]);
}
}
return $array;
}
var_export(removeEmptyValuesAndSubarrays($array));
输出:
array (
0 =>
array (
'Array' =>
array (
'Keep' => 'Keep',
),
'Pets' => 0,
),
1 =>
array (
'FavoriteNumber' => '0',
),
)
如果有人发现一个会导致我的递归方法失效的输入数组,请在评论中以最简单的形式发布,我会更新我的回答。
empty_array
不是一个已定义的函数。我也想知道你在这里的真正用例是什么... - Wesley Murch