不带密钥保存的 php array_filter
如果我过滤一个具有array_filter的数组以消除空值,则保留键,并在数组中生成“孔”。例如:
The filtered version of
[0] => 'foo'
[1] => null
[2] => 'bar'
is
[0] => 'foo'
[2] => 'bar'
我怎么能得到,而不是
[0] => 'foo'
[1] => 'bar'
?
如果我过滤一个具有array_filter的数组以消除空值,则保留键,并在数组中生成“孔”。例如:
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',
)
现在,对于工作方式:
方法#1:(,带/array_values()
array_filter()
!is_null()
)
var_export(array_values(array_filter($array,function($v){return !is_null($v);}))); // good
方法#2:(,自动索引数组,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',
)
...但事实证明,使用splat操作员进行“重新包装”远不如致电有效 。array_values()