在PHP 中, array_filter是一個非常實用的函數,用於根據回調函數的返回結果對數組進行過濾。默認情況下,如果不提供回調函數, array_filter會移除所有被認為是“假值”(Falsy values)的元素。這些“假值”包括:
false
null
0 (整數)
'0' (字符串)
'' (空字符串)
[] (空數組)
這可能會讓一些開發者感到疑惑,尤其是在他們原本只是想移除null或空字符串時,發現連整數0也被一起刪除了。那麼,為什麼會這樣呢?讓我們深入了解一下。
PHP 是一種弱類型語言,這意味著它在執行布爾運算時,會自動將某些類型轉換為布爾值。這種機制叫做類型強制(Type Juggling)。在布爾上下文中,下列值會被解釋為false :
var_dump((bool) false); // false
var_dump((bool) null); // false
var_dump((bool) 0); // false
var_dump((bool) '0'); // false
var_dump((bool) ''); // false
var_dump((bool) []); // false
只要某個值被轉換成布爾類型後是false , array_filter默認就會將其過濾掉。
array_filter的函數原型如下:
array_filter(array $array, ?callable $callback = null, int $mode = 0): array
當第二個參數$callback為null時, array_filter實際上是按如下邏輯工作:
$result = [];
foreach ($array as $key => $value) {
if ((bool) $value) {
$result[$key] = $value;
}
}
舉個例子:
$data = [0, 1, 2, null, '', 'hello', false];
$result = array_filter($data);
// 結果是 [1 => 1, 2 => 2, 5 => 'hello']
如你所見, 0 、 null 、 ''和false都被認為是“假”,因此都被移除了。
如果你只想過濾掉null值,而保留0和空字符串,你可以傳入一個自定義回調函數,例如:
$data = [0, '0', '', null, false, 'PHP'];
$result = array_filter($data, function ($item) {
return !is_null($item);
});
// 保留了 0、'0' 和 ''
再比如,如果你只想去除空字符串:
$result = array_filter($data, function ($item) {
return $item !== '';
});
這樣就能根據具體需求來精細控制哪些值需要被保留。
假設你正在構建一個表單提交系統,前端表單可能會傳回一些空字段,你希望只保留用戶真正填寫的內容:
$formData = [
'name' => 'Alice',
'email' => '',
'age' => 0,
'website' => null,
];
$filtered = array_filter($formData, function ($value) {
return $value !== '' && !is_null($value);
});
print_r($filtered);
輸出結果:
Array
(
[name] => Alice
[age] => 0
)
這個結果中,空字符串和null被剔除了,而0被保留,因為用戶可能真的填寫了年齡為0。
使用array_filter時,理解PHP 中“假值”的概念至關重要。默認情況下,它會移除所有等價於布爾false的值,而不僅僅是null或空字符串。如果你需要更精確的過濾行為,建議總是傳入一個自定義回調函數。
這樣一來,你就能避免誤刪有效數據,比如用戶確實填寫的“0”值,也能靈活應對各種業務場景。