当前位置: 首页> 最新文章列表> 如何使用多个 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 项目中帮到你!