array_filter()是PHP 中常用的函數之一,用於過濾數組中的元素。通常情況下, array_filter()只會返回符合條件的數組值,並且默認會重置數組的鍵名,即保留從0 開始的連續整數鍵名。但有時候,我們希望在過濾數組時能夠保留原始的鍵名。本文將介紹如何在使用array_filter()時保留數組的鍵名。
在討論如何保留鍵名之前,首先來看一下array_filter()的基本用法。 array_filter()函數會遍歷數組並根據回調函數的返回值決定是否保留數組中的元素。如果回調函數返回true ,則該元素將被保留,否則會被移除。
<?php
$array = [1, 2, 3, 4, 5];
$result = array_filter($array, function($value) {
return $value % 2 === 0; // 只保留偶數
});
print_r($result);
?>
輸出結果:
Array
(
[1] => 2
[3] => 4
)
如上所示, array_filter()會過濾數組,但會重置鍵名。在這個例子中, array_filter()的輸出數組鍵名從0開始,而我們希望保留原始數組的鍵名。
PHP 提供了一個常用的解決方法,使用array_filter()的第三個參數ARRAY_FILTER_USE_KEY 。當使用這個常量時, array_filter()將基於鍵名而不是值來執行回調函數,從而可以在過濾時保留鍵名。
<?php
$array = [1 => 10, 2 => 20, 3 => 30, 4 => 40, 5 => 50];
$result = array_filter($array, function($key) {
return $key % 2 === 0; // 保留偶數鍵
}, ARRAY_FILTER_USE_KEY);
print_r($result);
?>
輸出結果:
Array
(
[2] => 20
[4] => 40
)
在這個例子中,我們使用了ARRAY_FILTER_USE_KEY ,使得回調函數的參數是數組的鍵,而不是值。這樣,我們就可以基於鍵名的條件來過濾數組,同時保留原始的鍵名。
假設我們有一個數組,其中包含了多個URL 地址,我們希望過濾出包含m66.net域名的地址,並保留原始的鍵名。
<?php
$urls = [
'a' => 'http://example.com/page1',
'b' => 'https://m66.net/page2',
'c' => 'http://m66.net/page3',
'd' => 'https://example.com/page4',
];
$result = array_filter($urls, function($url) {
return strpos($url, 'm66.net') !== false; // 篩選出包含 m66.net 的 URL
});
print_r($result);
?>
輸出結果:
Array
(
[b] => https://m66.net/page2
[c] => http://m66.net/page3
)
如上所示, array_filter()篩選出了包含m66.net的URL 地址,並保留了它們的鍵名( b和c )。
array_filter()函數非常強大,可以用來過濾數組,但默認情況下會重置數組的鍵名。如果我們想要保留數組的鍵名,只需在使用array_filter()時指定ARRAY_FILTER_USE_KEY常量,這樣回調函數就會接受數組的鍵,而非僅僅是值。
通過這種方式,你可以根據鍵名或值的條件靈活地篩選數組,並保留原始鍵名,保持數組的結構完整。