如何比较两个数组并在下一次循环中从一个数组中删除匹配的元素?

21

你还可以如何比较两个数组($A 和 $B),并从第一个数组中减少匹配元素,以便为下一次循环数组 $A 做准备?

$A = array(1,2,3,4,5,6,7,8);
$B = array(1,2,3,4);

$C = array_intersect($A,$B);  //equals (1,2,3,4)
$A = array_diff($A,$B);       //equals (5,6,7,8)

这是最简单的方式吗?还是有其他我没有想到的方法可以使用?我的目标是拥有一个数组,我可以循环遍历,提取相关内容的组(我已经在其他地方定义了这些关系),直到数组返回 false。


可能是我自己的问题,但我认为这个问题不是很清楚。按照我的理解,你只是对array_diff($A,$B)感兴趣(这似乎非常简单)。或者$C的计算也是必要的吗?(如果是这样,你可以使用array_diff($A,$C)代替array_diff($A,$B)。) - mweerden
不,我声明$C为$A和$B的交集。 - kevtrout
5个回答

27

你已经掌握了。只需使用array_diffarray_intersect。没有比这更容易的了。

编辑: 例如:

$arr_1 = array_diff($arr_1, $arr_2);
$arr_2 = array_diff($arr_2, $arr_1);

来源


2
如果两个数组中值的顺序很重要,还应考虑使用array_diff_assoc - Duncanmoo

6
亲爱的易用且简洁的方式,
$clean1 = array_diff($array1, $array2); 
$clean2 = array_diff($array2, $array1); 
$final_output = array_merge($clean1, $clean2);

这个答案更好,因为它重新排列匹配索引上的数组元素。不像Stuart的答案会从匹配的索引中删除元素。所以如果在索引1处存在匹配的元素,你尝试在结果数组中访问索引1,它会抛出错误。 - Ajji
我不知道谁是斯图尔特,但提问者的要求并没有提到尊重数组索引的兴趣。这个答案和rg88的答案做了同样的事情,然后出于某种未知的原因调用了array_merge()函数。 - mickmackusa

2

另请参见array_unique。如果您将这两个数组连接起来,它将删除所有重复项。


我不认为这个回答解决了问题或提供了所需的输出。 - mickmackusa

0

嘿,更好的解决方案:array _ uintersect. 这让你像使用 array_intersect 一样比较数组,但它允许你使用回调函数比较数据。


array_uintersect() 有什么好处?我认为它在这个任务中没有提供任何价值。 - mickmackusa

-1

试一下这个

$a = array(0=>'a',1=>'x',2=>'c',3=>'y',4=>'w');
$b = array(1=>'a',6=>'b',2=>'y',3=>'z');
$c = array_intersect($a, $b);

$result = array_diff($a, $c);
print_r($result);

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