[英]php array_filter without key preservation
如果我使用array_filter過濾數組以消除空值,則會保留密鑰並在數組中生成“漏洞”。 例如:
The filtered version of
[0] => 'foo'
[1] => null
[2] => 'bar'
is
[0] => 'foo'
[2] => 'bar'
相反,我怎么能得到
[0] => 'foo'
[1] => 'bar'
?
您可以在過濾后使用array_values
來獲取值。
使用此輸入:
$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()
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操作符需要數字鍵)
代碼:( 演示 )
$array = ['foo', NULL, 'bar', 0, false, null, '0', ''];
$array = [...array_filter($array)];
var_export($array);
輸出:
array (
0 => 'foo',
1 => 'bar',
)
...但事實證明,使用splat運算符“重新打包”遠比調用array_values()
效率低得多。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.