php array_filter 没有密钥保存
Posted
技术标签:
【中文标题】php array_filter 没有密钥保存【英文标题】:php array_filter without key preservation 【发布时间】:2011-02-08 19:53:15 【问题描述】:如果我使用 array_filter 过滤数组以消除空值,则保留键并在数组中生成“洞”。例如:
The filtered version of
[0] => 'foo'
[1] => null
[2] => 'bar'
is
[0] => 'foo'
[2] => 'bar'
我怎样才能得到,而不是
[0] => 'foo'
[1] => 'bar'
?
【问题讨论】:
After array_filter(), how can I reset the keys to go in numerical order starting at 0的可能重复 【参考方案1】:您可以在过滤后使用array_values
来获取值。
【讨论】:
【参考方案2】:使用这个输入:
$array=['foo',NULL,'bar',0,false,null,'0',''];
有几种方法可以做到这一点。 Demo
提出array_filter
的贪婪默认行为有点离题,但如果您正在谷歌搜索此页面,这可能是与您的项目/任务相关的重要信息:
var_export(array_values(array_filter($array))); // NOT GOOD!!!!!
输出错误:
array (
0 => 'foo',
1 => 'bar',
)
现在介绍可行的方法:
方法#1:(array_values()
,array_filter()
w/!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 运算符需要数字键)
代码:(Demo)
$array = ['foo', NULL, 'bar', 0, false, null, '0', ''];
$array = [...array_filter($array)];
var_export($array);
输出:
array (
0 => 'foo',
1 => 'bar',
)
...但事实证明,使用 splat 运算符 is far less efficient “重新打包”而不是调用 array_values()
。
【讨论】:
以上是关于php array_filter 没有密钥保存的主要内容,如果未能解决你的问题,请参考以下文章