从两个数组中获取唯一值

17
我有两个数组,我试图从它们中获取唯一的值。所以我不只是想要删除重复项,实际上我想要删除两个数组中的重复项。所以如果我像这样获取2个数组:
$array1 = array();
$array2 = array();

foreach($values1 as $value1){ //output: $array1 = 10, 15, 20, 25;
    $array1[] = $value1;
}   

foreach($values2 as $value2){ //output: $array2 = 10, 15, 100, 150;
    $array2[] = $value2;
}

我要的最终输出是

$output = 20, 25, 100, 150;

有没有简便的方法来完成这个任务?


这些数组是真正的数组,还是映射?为了让我的问题更清楚,你的键是0、1、2等数字,还是单词等其他类型的键? - codersarepeople
@codersarepeople 它们不是数组映射。它们是包含数字的单独分离数组。一个可能有3个值,另一个可能有10个值。它们都是4只是巧合。 - lok
8个回答

45
其他回答方向正确,但array_diff只能单向工作--即返回在第一个给定的数组中存在但在其他任何数组中都不存在的值。

你想做的是双向获取差异然后将差异合并在一起:

$array1 = array(10, 15, 20, 25);
$array2 = array(10, 15, 100, 150);
$output = array_merge(array_diff($array1, $array2), array_diff($array2, $array1));
// $output will be (20, 25, 100, 150);

8

不是要否定Daniel Vandersluis的回答,而是要补充一些内容...

你需要的基本上是数组的异或操作。为此,“merlinyoda at dorproject dot net”在http://php.net/manual/en/function.array-diff.php的评论中提供了以下例程:

<?php
function array_xor ($array_a, $array_b) {
    $union_array = array_merge($array_a, $array_b);
    $intersect_array = array_intersect($array_a, $array_b);
    return array_diff($union_array, $intersect_array)
}
?>

这个函数对计算异或采用了不同的方法。


值得注意的是,Daniel Vandersluis的答案使用自己的键重置了数组 - 这种方法实际上保留了键,因此您最终可以得到一个带有键1、2、3、5、7、8、11等的数组。 - Morgan

4

尝试以下代码,它适用于数字、字符串和所有条件。

以下逻辑仅适用于数字

$array1 = array(10, 15, 20, 25);
$array2 = array(10, 15, 100, 150);
$output = array_merge(array_diff($array1, $array2), array_diff($array2, $array1));

以下逻辑对于任何条件都有效。
$a1 = array('1@gmail.com'); 
$a2 = array('1@gmail.com','2@gmail.com');
$new_array=array_merge($a1,$a2);
$unique=array_unique($new_array);

谢谢


感谢您提供这段代码片段,它可能会在短期内提供一些有限的帮助。通过展示为什么这是一个好的解决方案,适当的解释将极大地提高其长期价值,并使其对未来具有类似问题的读者更有用。请编辑您的答案以添加一些解释,包括您所做的假设。 - Toby Speight
请注意,"上面"和"下面"取决于您查看问题的方式 - 答案没有自然顺序。 - Toby Speight
请给上面的答案点赞,这样读者就可以轻松地获得正确的答案。 - Rohit Joshi

4
这里是完成此操作的代码。它可能可以进行优化,但你已经有了思路:
$array1 = array(10, 15, 20, 25);
$array2 = array(10, 15, 100, 150);

$new_array = array();
foreach($array1 as $value) {
    if(!in_array($value, $array2)) {
        array_push($new_array, $value);
    }
}
foreach($array2 as $value) {
    if(!in_array($value, $array1)) {
        array_push($new_array, $value);
    }
}

print_r($new_array);

要使用array_diff,您需要执行以下操作:

$array1 = array(10, 15, 20, 25);
$array2 = array(10, 15, 100, 150);

$out1 = array_diff($array1, $array2);
$out2 = array_diff($array2, $array1);
$output = array_merge($out1, $out2);

print_r($output);

2

另一个好的解决方案是:

$array1 = array(10, 15, 20, 25);

$array2 = array(10, 15, 100, 150);

$output = array_diff(array_merge($array1, $array2), array_intersect($array1, $array2));

// $output 将会是 (20, 25, 100, 150);


1

array_diff() (manual) 函数可用于查找两个数组之间的差异:

$array1 = array(10, 20, 40, 80);
$array2 = array(10, 20, 100, 200);
$diff = array_diff($array1, $array2);
// $diff = array(40, 80, 100, 200);

您可以将任意数量的数组传递给函数,不仅限于两个数组。


3
使用你的代码,$diff 将会是 array(40, 80)array_diff 只能单向工作。请查看我的答案获取更多细节。 - Daniel Vandersluis

0
您可以像下面这样使用 array_mergearray_unique:
$array1 = array(10, 15, 20, 25);
$array2 = array(10, 15, 100, 150);
$output = array_unique(array_merge($array1, $array2));

这很简单易懂。


-1

2
这不会给你期望的结果,因为 array_diff 只返回第一个数组中独有的值。请查看我的答案获取更多细节。 - Daniel Vandersluis
2
这将仅返回从数组1到数组2的差异,这意味着它只会显示在数组2中不存在的数组1中的项目。您必须比较两组数组。 - Chuck Burgess

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接