當前位置: 首頁> 最新文章列表> 如何使用多個array_diff() 實現數組對稱差集?

如何使用多個array_diff() 實現數組對稱差集?

M66 2025-06-06

在日常開發中,我們經常會遇到需要比較兩個數組,找出它們之間不同元素的情況。這時候,如果只是找出某個數組中存在而另一個數組中不存在的元素, array_diff()函數就已經足夠了。但是如果我們需要找出,那就需要稍微組合一下array_diff()

什麼是對稱差集?

對稱差集,通俗地講,就是兩個集合中不重複的元素的合集。舉個例子:

 $array1 = [1, 2, 3, 4];
$array2 = [3, 4, 5, 6];

這兩個數組的對稱差集就是[1, 2, 5, 6] ,因為這四個數在其中一個數組中存在,而在另一個中不存在。

用PHP 的array_diff() 實現

array_diff()可以找出第一個數組中存在、而在其他數組中不存在的值。因此,我們可以用兩個array_diff()來獲取對稱差集:

 <?php
$array1 = [1, 2, 3, 4];
$array2 = [3, 4, 5, 6];

// 找出 array1 中有而 array2 中沒有的
$diff1 = array_diff($array1, $array2);

// 找出 array2 中有而 array1 中沒有的
$diff2 = array_diff($array2, $array1);

// 合併兩個差集結果
$symmetricDifference = array_merge($diff1, $diff2);

print_r($symmetricDifference);
?>

輸出結果將是:

 Array
(
    [0] => 1
    [1] => 2
    [4] => 5
    [5] => 6
)

這裡的鍵可能不是連續的,如果需要重新索引,可以加一句:

 $symmetricDifference = array_values($symmetricDifference);

在實際項目中應用

假設你正在構建一個會員系統,需要比較兩個用戶組權限的差異。可以通過這種方式找出不同的權限:

 <?php
$userGroupA = ['read', 'write', 'delete'];
$userGroupB = ['read', 'export', 'import'];

$diff1 = array_diff($userGroupA, $userGroupB);
$diff2 = array_diff($userGroupB, $userGroupA);

$permissionDiff = array_merge($diff1, $diff2);
$permissionDiff = array_values($permissionDiff);

print_r($permissionDiff);

// 結果:['write', 'delete', 'export', 'import']
?>

提示:使用array_unique() 做進一步去重

雖然在對稱差集中我們合併的是兩個互斥差集,但如果數組中有重複元素,也可能產生重複結果。可以加上array_unique()做一次去重:

 $symmetricDifference = array_unique(array_merge($diff1, $diff2));

總結

通過組合使用兩個array_diff()函數,我們可以輕鬆獲取兩個數組的對稱差集。這種方法既清晰又簡潔,尤其適用於權限系統、數據比對等場景。

你可以將這個方法封裝成函數,提升復用性:

 function symmetric_diff(array $a, array $b): array {
    return array_values(array_unique(array_merge(
        array_diff($a, $b),
        array_diff($b, $a)
    )));
}

// 示例調用
$result = symmetric_diff([1, 2, 3], [2, 3, 4]);
print_r($result); // 輸出:[1, 4]

希望這個小技巧能在你的PHP 項目中幫到你!