array_filter()
不是类型敏感默认。这意味着任何zero-ish,false-y,null,空值将被删除。我遵循的链接将证明这一点。
OP的样本输入数组是2维的。如果数据结构是静态的,那么递归是不必要的。对于任何想要从多维数组中过滤零长度值的人,我会提供一个静态2-dim方法和递归方法。
静态2维数组: 该代码执行对第二级元素“零安全”过滤器,然后除去空子阵列:(See this demo to see this method work with different (trickier) array data)
$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()
呼叫。
未知深度的多维数组递归方法:当在阵列级的数目是未知的,递归是逻辑技术。以下代码将处理每个子数组,删除零长度值和任何空子数组。 Here is a demo of this code with a few sample inputs.
$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',
),
)
如果有人发现了一个输入数组,打破我的递归方法,请张贴(最简单的形式)的评论,我会更新我的答案。
array_filter设置为1D数组。 – 2012-03-27 18:14:28
您能提供样品输入,请预期输出吗?有几种不同的方式来解释你的问题,*“如果它看起来像上面那样,我希望它在我处理它之后是完全空的。”*将我抛弃,你希望它完全消失还是成为一个空阵列? – 2012-03-27 18:19:57
这是一个多维数组。 array_filter只能在一个维度上工作。你需要遍历你的数组,并首先将array_filter应用到每个迭代。 – Nilpo 2012-03-27 18:20:54