當前位置: 首頁> 最新文章列表> 忽視了空字符串、0 和null 都被當作“假值”

忽視了空字符串、0 和null 都被當作“假值”

M66 2025-06-05

在PHP 中, array_filter是一個非常實用的函數,用於根據回調函數的返回結果對數組進行過濾。默認情況下,如果不提供回調函數, array_filter會移除所有被認為是“假值”(Falsy values)的元素。這些“假值”包括:

  • false

  • null

  • 0 (整數)

  • '0' (字符串)

  • '' (空字符串)

  • [] (空數組)

這可能會讓一些開發者感到疑惑,尤其是在他們原本只是想移除null或空字符串時,發現連整數0也被一起刪除了。那麼,為什麼會這樣呢?讓我們深入了解一下。

PHP 中的“假值”概念

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

只要某個值被轉換成布爾類型後是falsearray_filter默認就會將其過濾掉。

array_filter的默認行為

array_filter的函數原型如下:

 array_filter(array $array, ?callable $callback = null, int $mode = 0): array

當第二個參數$callbacknull時, 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']

如你所見, 0null''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”值,也能靈活應對各種業務場景。