PHP合并仅NOT DUPLICATED值的数组


72

我需要将两个数组合并为1个数组,但我需要在它们具有相同的主数据之前删除(我是说重复的值),合并时只需要唯一的值即可。

我怎样才能做到这一点?

这是数组示例:

第一个数组

array(3) { 
    [0]=> object(stdClass)#17 (1) { 
        ["email"]=> string(7) "gffggfg" 
    } 
    [1]=> object(stdClass)#18 (1) { 
        ["email"]=> string(6) "wefwef@test.it" 
    } 
    [2]=> object(stdClass)#19 (1) { 
        ["email"]=> string(6) "wefewf" 
    } 
} 

第二个数组

array(3) { 
    [0]=> object(stdClass)#17 (1) { 
        ["email"]=> string(7) "gffggfg@test.it" 
    } 
    [1]=> object(stdClass)#18 (1) { 
        ["email"]=> string(6) "wefwef" 
    } 
    [2]=> object(stdClass)#19 (1) { 
        ["email"]=> string(6) "wefewf" 
    } 
} 

Answers:


183

您可以将array_merge()功能与array_unique()功能结合使用(两个标题都是不言而喻的)

$array = array_unique (array_merge ($array1, $array2));

以及我可以看到array_merge()似乎不计算重复项,因此array_unique()是否在我的情况下被弃用!
itsme 2012年

1
array_merge()不会添加重复的键,但是当您具有使用不同键的重复值时,它确实会添加这些键
Jeroen 2012年

太好了,我只需要array_merge()因为在所有数组中我总是有相同的键,真的很感谢!
itsme 2012年

1
应该添加提及SORT_REGULAR和其他选项,以避免转换类型时出错。
布兰登·埃利奥特

4
注意:array_unique保留键,因此对于数字索引数组,如果需要顺序键,可以通过调用array_values
highvolt

12

如果我正确理解了这个问题:

 $a1 = Array(1,2,3,4);
 $a2 = Array(4,5,6,7);
 $array =  array_diff(array_merge($a1,$a2),array_intersect($a1,$a2));
 print_r($array);

返回

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

抱歉,我忘了我有多
级数

2

我一直在执行我可以想象的所有方式的一些基准测试。我对堆叠10-20个字符串元素的数组进行了测试,结果是一个数组中所有唯一的字符串都在其中。仅堆叠2个数组的情况大致相同。

我找到的最快的东西是我尝试过的最简单的方法。

$uniques = [];
foreach($manyArrays as $arr ) {
  $uniques = array_unique(array_merge($uniques, $arr));
}

我将这个品牌称为“太天真了,无法工作”,因为它必须在每次迭代中对唯一数组进行排序。但是,这比任何其他方法都快。使用manyArrays中的500.000个元素进行测试,每个元素包含PHP 7.3中的10-20个字符串。

这种方法紧随其后,大约慢了10%。

$uniques = [];
foreach($manyArrays as $arr ) {
  foreach($arr as $v) {
    if( !in_array($v, $uniques, false) ) {
      $uniques[] = $v;
    }
  }
}

在某些情况下,第二种方法可能更好,因为它支持in_array()的'strict'参数用于严格类型检查。如果将其设置为true,则第二个选项的确会比第一个选项(约40%)慢很多。第一个选项不支持严格类型检查。


1

更快的解决方案:

function concatArrays($arrays){
    $buf = [];
    foreach($arrays as $arr){
        foreach($arr as $v){
            $buf[$v] = true;
        }
    }
    return array_keys($buf);
}


$array = concatArrays([$array1, $array2]);

3
嵌套的foreach如何比内置函数更快。你有基准吗?
mcmurphy '19

-1

答案有点晚了,但是我发现数组联合运算符+做得很好(在第3部分中找到)。

$array1 + $array2 = $array //if duplicate found, the value in $array1 will be considered ($array2 value for array_merge, if keys clearly specified)

并不是一个很好的选择!如果Array KEY相同,即使VALUE也不相同,也会得到错误的数据,例如:$ array1 = Array([0] => 0,[1] => 1,[2] => 2)$ array2 = Array([0 ] => 3)$ array1 + $ array2 = Array([0] => 0,[1] => 1,[2] => 2)更好的选择是array_unique(array_merge($ array1,$ array2))= Array([0] => 0,[1] => 1,[2] => 2,[3] => 3)
Pran

这不会导致数组值的并集,请参见php.net
Aurovrata,2012年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.