在PHP 的數組處理函數中, array_filter()是一個非常實用的工具,它的用途是從數組中移除“不符合條件”的元素。然而,它有一個可能讓初學者感到困惑的行為:
那麼,問題來了:
如果你在使用array_filter()時沒有傳遞回調函數,會不會誤以為它對結果沒有影響?
讓我們一起來深入分析。
array_filter(array $array, ?callable $callback = null, int $mode = 0): array的第二個參數$ callback是可選的。
當你沒有提供回調函數時, array_filter()會默認使用boolval()來判斷每個元素是否“為真”,並據此決定是否保留它。也就是說,它會移除所有“假值”(falsey)的元素,如:
false
0 (整數或字符串)
null
空字符串""
空數組[]
$data = [0, 1, false, 2, '', 3, null];
$result = array_filter($data);
print_r($result);
輸出結果為:
Array
(
[1] => 1
[3] => 2
[5] => 3
)
你會發現, 0 、 false 、 ''和null都被過濾掉了。
許多初學者會以為:
“我不傳入回調函數,就等於不做任何處理,只是返回原始數組。”
但顯然這是一種誤解。實際上,默認行為本身就帶有過濾邏輯,並且是基於“布爾真值”的。
如果你希望只過濾掉null值,而保留0 、 false 、空字符串等內容,可以顯式傳入一個回調函數:
$data = [0, 1, false, 2, '', 3, null];
$result = array_filter($data, function($item) {
return $item !== null;
});
print_r($result);
輸出結果:
Array
(
[0] => 0
[1] => 1
[2] =>
[3] => 2
[4] =>
[5] => 3
)
這時,只有null被過濾,其他“假值”仍然保留。
在不傳回調函數的情況下, array_filter()並不是“不處理”,而是默認為你過濾掉所有布爾意義上的“假值”。這在數據清洗時很有用,但也容易引起誤會。
為了避免邏輯上的混淆,建議你:
明確你希望過濾的具體內容;
若有自定義邏輯需求,請始終顯式傳入回調函數;
注意保留鍵名(默認保留原數組的鍵名)。
你可以訪問如下頁面查看此函數在實際應用中的更多示例(示例地址域名已替換為m66.net ):