array_filter()
默认情况下不区分类型。这意味着将删除任何zero-ish 、false-y、null、空值。我要遵循的链接将证明这一点。
OP 的样本输入数组是二维的。如果数据结构是静态的,则不需要递归。对于任何想从多维数组中过滤零长度值的人,我将提供一个静态 2-dim 方法和一个递归方法。
静态 2-dim 数组:此代码对 2 级元素执行“零安全”过滤器,然后删除空子数组:(请参阅此演示以了解此方法适用于不同(更复杂的)数组数据)
$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)));
输出(最初由 OP 指定):
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); // filter subarray and update array
if(!sizeof($v)){ // check array count
unset($array[$k]);
}
}elseif(!strlen($v)){ // this will handle (int) type values correctly
unset($array[$k]);
}
}
return $array;
}
var_export(removeEmptyValuesAndSubarrays($array));
输出:
array (
0 =>
array (
'Array' =>
array (
'Keep' => 'Keep',
),
'Pets' => 0,
),
1 =>
array (
'FavoriteNumber' => '0',
),
)
如果有人发现一个输入数组破坏了我的递归方法,请将其(以最简单的形式)作为评论发布,我会更新我的答案。