當前位置: 首頁> 最新文章列表> 使用array_filter() 時忽略了鍵名的保留

使用array_filter() 時忽略了鍵名的保留

M66 2025-05-17

在PHP 中, array_filter()函數是一個常見的數組處理工具,它用於過濾數組中的元素。 array_filter()函數接受一個回調函數和一個數組作為參數,返回一個新數組,其中包含所有滿足回調函數條件的元素。

默認情況下, array_filter()會保留過濾後數組的鍵名(下標)。不過,很多開發者在使用時可能會發現,鍵名沒有被保留,或者會發生一些意料之外的情況。那麼,為什麼會出現這種現象呢?

1. array_filter()的行為

array_filter()的基本功能是根據回調函數的返回值來決定哪些元素被保留。回調函數返回true的元素會被保留下來,而返回false的元素會被移除。它的語法如下:

 array_filter(array $array, callable $callback = null, int $mode = 0): array
  • $array :待過濾的數組。

  • $callback :用於過濾的回調函數。如果省略,默認會保留所有不為空的值。

  • $mode :一個可選的參數,可以控制數組的索引方式,通常為ARRAY_FILTER_USE_KEYARRAY_FILTER_USE_BOTH

2. 默認情況下, array_filter()會保留鍵名

當我們調用array_filter()時,它會保留數組元素的原始鍵名。例如,考慮以下示例:

 $input = [0 => 'apple', 1 => 'orange', 2 => 'banana'];
$result = array_filter($input, function($value) {
    return strlen($value) > 5;
});

print_r($result);

輸出將是:

 Array
(
    [1] => orange
    [2] => banana
)

可以看到,原始鍵名(1 和2)被保留了下來。

3. array_filter()忽略鍵名的情況

但在某些情況下,如果你發現array_filter()沒有保留鍵名,通常是因為在調用時使用了ARRAY_FILTER_USE_KEYARRAY_FILTER_USE_BOTH模式,或者回調函數返回了不同的值。

讓我們來看看這個例子:

 $input = [0 => 'apple', 1 => 'orange', 2 => 'banana'];
$result = array_filter($input, function($key) {
    return $key > 0;
}, ARRAY_FILTER_USE_KEY);

print_r($result);

這段代碼會輸出:

 Array
(
    [1] => orange
    [2] => banana
)

雖然這裡我們使用了ARRAY_FILTER_USE_KEY模式,但鍵名仍然得到了保留,因為我們過濾的是鍵值而非實際元素的值。

4. 為什麼array_filter()會忽略鍵名的保留?

array_filter()默認只過濾數組的值,而不會更改數組的鍵。如果你使用ARRAY_FILTER_USE_KEYARRAY_FILTER_USE_BOTH ,鍵名有可能會被重新計算或重置。這是由於PHP 的內部處理邏輯所致,特別是在使用不同的過濾模式時,返回值可能會影響鍵名的保留。

5. 解決方案:重建索引

如果你希望過濾後的數組重新生成連續的鍵名,可以使用array_values()來重建索引:

 $input = [0 => 'apple', 1 => 'orange', 2 => 'banana'];
$result = array_filter($input, function($value) {
    return strlen($value) > 5;
});
$result = array_values($result);

print_r($result);

輸出:

 Array
(
    [0] => orange
    [1] => banana
)

如你所見,使用array_values()後,數組鍵被重新索引,得到了從0 開始的連續鍵名。

6. 總結

array_filter()在默認情況下保留鍵名,但在特定模式下可能會發生鍵名丟失的現象,特別是使用ARRAY_FILTER_USE_KEYARRAY_FILTER_USE_BOTH時。如果你需要重置鍵名,可以通過array_values()來解決。

希望這篇文章對你理解array_filter()的行為有所幫助!