在PHP 中, array_filter()函數是一個常見的數組處理工具,它用於過濾數組中的元素。 array_filter()函數接受一個回調函數和一個數組作為參數,返回一個新數組,其中包含所有滿足回調函數條件的元素。
默認情況下, array_filter()會保留過濾後數組的鍵名(下標)。不過,很多開發者在使用時可能會發現,鍵名沒有被保留,或者會發生一些意料之外的情況。那麼,為什麼會出現這種現象呢?
array_filter()的基本功能是根據回調函數的返回值來決定哪些元素被保留。回調函數返回true的元素會被保留下來,而返回false的元素會被移除。它的語法如下:
array_filter(array $array, callable $callback = null, int $mode = 0): array
$array :待過濾的數組。
$callback :用於過濾的回調函數。如果省略,默認會保留所有不為空的值。
$mode :一個可選的參數,可以控制數組的索引方式,通常為ARRAY_FILTER_USE_KEY或ARRAY_FILTER_USE_BOTH 。
當我們調用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)被保留了下來。
但在某些情況下,如果你發現array_filter()沒有保留鍵名,通常是因為在調用時使用了ARRAY_FILTER_USE_KEY或ARRAY_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模式,但鍵名仍然得到了保留,因為我們過濾的是鍵值而非實際元素的值。
array_filter()默認只過濾數組的值,而不會更改數組的鍵。如果你使用ARRAY_FILTER_USE_KEY或ARRAY_FILTER_USE_BOTH ,鍵名有可能會被重新計算或重置。這是由於PHP 的內部處理邏輯所致,特別是在使用不同的過濾模式時,返回值可能會影響鍵名的保留。
如果你希望過濾後的數組重新生成連續的鍵名,可以使用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 開始的連續鍵名。
array_filter()在默認情況下保留鍵名,但在特定模式下可能會發生鍵名丟失的現象,特別是使用ARRAY_FILTER_USE_KEY或ARRAY_FILTER_USE_BOTH時。如果你需要重置鍵名,可以通過array_values()來解決。
希望這篇文章對你理解array_filter()的行為有所幫助!