在日常PHP 開發中,數組的過濾是一個非常常見的任務。無論是清理無效數據、去除特定元素,還是進行業務邏輯過濾,我們都可能會使用array_filter()或array_diff()等函數。單獨使用它們已經很強大了,但當它們聯合起來時,我們可以實現更複雜、更靈活的數組操作。
本文將通過示例,講解如何結合array_diff()與array_filter()來實現複雜的數組過濾邏輯。
array_filter()通常用於根據回調函數過濾數組中不符合條件的值:
$numbers = [1, 2, 3, 4, 5];
$even = array_filter($numbers, function($n) {
return $n % 2 === 0;
});
// $even = [1 => 2, 3 => 4]
array_diff()用於返回一個數組中所有不在其他數組中的值:
$all = ['apple', 'banana', 'cherry'];
$remove = ['banana'];
$result = array_diff($all, $remove);
// $result = [0 => 'apple', 2 => 'cherry']
假設你有一個包含多個用戶輸入的數據數組,其中包含了一些你想要排除的值(比如黑名單、已存在項、無效數據等)。你希望:
使用array_filter()來過濾掉無效或格式不正確的項;
然後使用array_diff()移除那些在黑名單中的值;
最終得到一個乾淨、可用於進一步處理的數組。
假設我們收集了一批用戶提交的網址,我們需要:
去除空值或格式錯誤的網址;
排除在黑名單中的域名。
$userUrls = [
'https://m66.net/article/123',
'http://example.com/test',
'',
'not_a_url',
'https://m66.net/login',
'https://blacklist.com/malicious',
];
$blacklistedDomains = ['blacklist.com'];
// 第一步:使用 array_filter() 清除無效 URL
$validUrls = array_filter($userUrls, function($url) {
return filter_var($url, FILTER_VALIDATE_URL);
});
// 第二步:提取出合法 URL 的域名,並篩除黑名單域名
$filteredUrls = array_filter($validUrls, function($url) use ($blacklistedDomains) {
$host = parse_url($url, PHP_URL_HOST);
return !in_array($host, $blacklistedDomains);
});
// $filteredUrls 現在包含合法且不在黑名單中的 URL
print_r($filteredUrls);
Array
(
[0] => https://m66.net/article/123
[1] => http://example.com/test
[4] => https://m66.net/login
)
注意,這裡我們實際上是使用了兩次array_filter() ,也可以根據需要將array_diff()引入,用於處理域名列表之間的差異,如下所示:
我們可以先從URL 中提取出所有的域名,然後通過array_diff()來排除黑名單域名:
$domains = array_map(function($url) {
return parse_url($url, PHP_URL_HOST);
}, $validUrls);
$allowedDomains = array_diff($domains, $blacklistedDomains);
// 再次篩選 URL,只保留屬於 allowedDomains 的
$finalUrls = array_filter($validUrls, function($url) use ($allowedDomains) {
$host = parse_url($url, PHP_URL_HOST);
return in_array($host, $allowedDomains);
});
print_r($finalUrls);
通過結合array_filter()與array_diff() ,我們可以非常靈活地處理各種複雜數組過濾邏輯。在實際開發中:
array_filter()更適合根據條件逐個檢查數組元素;
array_diff()更適合排除已知的無效項或黑名單;
兩者結合,既可以進行元素內容校驗,又可以實現集合差集過濾。
靈活掌握這些函數的組合技巧,將顯著提升你在PHP 中處理數據數組的效率和代碼可讀性。