許多開發者習慣寫:
<?php
foreach ($arr as $k => $v) {
if (!$v) unset($arr[$k]);
}
?>
這樣做有兩個缺點:
foreach 操作的是陣列副本,大陣列記憶體開銷大。0、'0'、false、null、'' 等「空值」定義。array_filter() 可用回呼函式過濾,**若省略回呼,預設移除所有轉換為 false 的值**(即 0, '0', false, null, '', array())。
<?php
$entry = array(
0 => 'foo',
1 => false,
2 => -1,
3 => null,
4 => ''
);
print_r(array_filter($entry));
輸出:
Array
(
[0] => foo
[2] => -1
)
注意:-1 為真值被保留,鍵名 0、2 保持不變。
0 與 '0' 的自訂回呼<?php
$arr = ['a', 0, '0', '', null, false, 'text'];
$result = array_filter($arr, function($v) {
return $v !== '' && $v !== null && $v !== false; // 保留 0 和 '0'
});
print_r($result);
<?php
$strDelCodes = "A;B;;C;;C;D;;;D;D";
$rsArray = array_values(
array_unique(
array_diff(explode(';', $strDelCodes), array(''))
)
);
// 結果:Array ( [0] => A [1] => B [2] => C [3] => D )
函式鏈說明:
explode 分割字串array_diff(..., ['']) 移除空字串array_unique 去重(保留第一次出現)array_values 重置數字索引| 函式 | 用途 |
|---|---|
array_slice | 陣列切片(相當於 LIMIT) |
array_splice | 移除/替換陣列片段 |
array_merge | 合併陣列(數字鍵重新索引,字串鍵後覆蓋前) |
array_diff | 差集(僅比較值) |
array_intersect | 交集 |
善用 array_filter() 預設行為或自訂回呼,配合 array_values() 重建索引,即可以最簡潔、效能最佳的方式處理陣列空值。請多閱讀官方手冊,發掘更多內建函式威力。