PHP数组过滤函数array_filter不保留键名

52

如果我使用 array_filter 来过滤一个数组中的 null 值,键会被保留并在数组中产生“空洞”。例如:

The filtered version of
    [0] => 'foo'
    [1] =>  null
    [2] => 'bar'
is 
    [0] => 'foo'
    [2] => 'bar'

我该如何获取替代方案?

[0] => 'foo'
[1] => 'bar'

2个回答

97

10

使用这个输入:

$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

方法 #3:(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()高效。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接