當前位置: 首頁> 最新文章列表> array_diff() 與array_filter() 聯合實現更複雜的過濾邏輯

array_diff() 與array_filter() 聯合實現更複雜的過濾邏輯

M66 2025-05-14

在日常PHP 開發中,數組的過濾是一個非常常見的任務。無論是清理無效數據、去除特定元素,還是進行業務邏輯過濾,我們都可能會使用array_filter()array_diff()等函數。單獨使用它們已經很強大了,但當它們聯合起來時,我們可以實現更複雜、更靈活的數組操作。

本文將通過示例,講解如何結合array_diff()array_filter()來實現複雜的數組過濾邏輯。

一、基礎回顧

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()

array_diff()用於返回一個數組中所有不在其他數組中的值:

 $all = ['apple', 'banana', 'cherry'];
$remove = ['banana'];
$result = array_diff($all, $remove);
// $result = [0 => 'apple', 2 => 'cherry']

二、問題場景

假設你有一個包含多個用戶輸入的數據數組,其中包含了一些你想要排除的值(比如黑名單、已存在項、無效數據等)。你希望:

  • 使用array_filter()來過濾掉無效或格式不正確的項;

  • 然後使用array_diff()移除那些在黑名單中的值;

  • 最終得到一個乾淨、可用於進一步處理的數組。

三、實戰示例

假設我們收集了一批用戶提交的網址,我們需要:

  1. 去除空值或格式錯誤的網址;

  2. 排除在黑名單中的域名。

 $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()引入,用於處理域名列表之間的差異,如下所示:

四、結合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 中處理數據數組的效率和代碼可讀性。