如果我使用 array_filter
来过滤一个数组中的 null 值,键会被保留并在数组中产生“空洞”。例如:
The filtered version of
[0] => 'foo'
[1] => null
[2] => 'bar'
is
[0] => 'foo'
[2] => 'bar'
我该如何获取替代方案?
[0] => 'foo'
[1] => 'bar'
使用这个输入:
$array=['foo',NULL,'bar',0,false,null,'0',''];
有几种方法可以实现。 演示
提到array_filter
的贪婪默认行为可能略有偏题,但如果您正在谷歌搜索此页面,则这可能是与您的项目/任务相关的重要信息:
var_export(array_values(array_filter($array))); // NOT GOOD!!!!!
错误的输出:
array (
0 => 'foo',
1 => 'bar',
)
array_values()
、带有!is_null()
参数的array_filter()
函数)
var_export(array_values(array_filter($array,function($v){return !is_null($v);}))); // good
方法二:(foreach()
,自动索引数组,!==null
)
foreach($array as $v){
if($v!==null){$result[]=$v;}
}
var_export($result); // good
array_walk()
,自动索引数组,!is_null()
)array_walk($array,function($v)use(&$filtered){if(!is_null($v)){$filtered[]=$v;}});
var_export($filtered); // good
array (
0 => 'foo',
1 => 'bar',
2 => 0,
3 => false,
4 => '0',
5 => '',
)
从PHP7.4开始,您甚至可以像这样执行“重组”操作:(splat运算符要求数字键)
代码:(演示)
$array = ['foo', NULL, 'bar', 0, false, null, '0', ''];
$array = [...array_filter($array)];
var_export($array);
输出:
array (
0 => 'foo',
1 => 'bar',
)
事实证明,使用展开运算符进行“重打包”远不如调用array_values()
高效。