77

我需要将两个数组合并为 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" 
    } 
} 
4

5 回答 5

198

您可以将array_merge()功能与array_unique()功能结合起来(两个标题都很不言自明)

$array = array_unique (array_merge ($array1, $array2));
于 2012-05-13T14:36:21.847 回答
13

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

 $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
)
于 2012-05-13T14:41:26.270 回答
4

我一直在运行一些我能想象到的所有方式的基准测试。我对堆叠大量包含 10-20 个字符串元素的数组进行了测试,结果生成了一个包含所有唯一字符串的数组。对于仅堆叠 2 个阵列,这应该是相同的。

我发现最快的是我尝试过的最简单的事情。

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

我给这个贴上了“太天真而无法工作”的标签,因为它必须在每次迭代时对 uniques 数组进行排序。然而,这比任何其他方法都快。在 manyArrays 中使用 500.000 个元素进行测试,每个元素包含 10-20 个字符串(来自 PHP 7.3)。

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

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

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

于 2020-05-22T13:31:32.140 回答
1

更快的解决方案:

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


$array = concatArrays([$array1, $array2]);
于 2018-01-04T19:53:44.280 回答
-1

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

$array1 + $array2 = $array //if duplicate found, the value in $array1 will be considered ($array2 value for array_merge, if keys clearly specified)
于 2019-06-06T13:09:42.747 回答