在日常開發中,我們經常會遇到需要比較兩個數組,找出它們之間不同元素的情況。這時候,如果只是找出某個數組中存在而另一個數組中不存在的元素, array_diff()函數就已經足夠了。但是如果我們需要找出,那就需要稍微組合一下array_diff() 。
對稱差集,通俗地講,就是兩個集合中不重複的元素的合集。舉個例子:
$array1 = [1, 2, 3, 4];
$array2 = [3, 4, 5, 6];
這兩個數組的對稱差集就是[1, 2, 5, 6] ,因為這四個數在其中一個數組中存在,而在另一個中不存在。
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()做一次去重:
$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 項目中幫到你!