PHP合并仅具有NOT DUPLICATED值的数组

its*_*sme 55 php arrays merge

我需要将两个数组合并为一个数组,但我需要的是在它们共有的主数据之前删除(我的意思是重复值),合并时我只需要唯一的值.

我怎样才能做到这一点?

这是数组示例:

第一个阵列

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" 
    } 
} 
Run Code Online (Sandbox Code Playgroud)

第二阵列

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" 
    } 
} 
Run Code Online (Sandbox Code Playgroud)

Jer*_*oen 148

你可以将array_merge()功能与array_unique()功能结合起来(这两个标题都是不言自明的)

$array = array_unique (array_merge ($array1, $array2));
Run Code Online (Sandbox Code Playgroud)

  • 注意:`array_unique`保留键,所以对于数字索引的数组,如果你需要顺序键,你可以通过调用`array_values'来快速重新键入 (3认同)
  • 尽管这个简洁的答案得到了大量的赞成票和绿色勾号,[使用提问者的样本数据证明它是不正确的](https://3v4l.org/CoepY)。 (3认同)

Luc*_*one 11

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

 $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);
Run Code Online (Sandbox Code Playgroud)

返回

Array
(
[0] => 1
[1] => 2
[2] => 3
[5] => 5
[6] => 6
[7] => 7
)
Run Code Online (Sandbox Code Playgroud)


Joe*_*ort 6

我一直在对我能想象到的所有方法进行一些基准测试。我对堆叠大量 10-20 个字符串元素的数组进行了测试,最终得到一个包含所有唯一字符串的数组。对于仅堆叠 2 个数组来说,这应该是相同的。

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

$uniques = [];
foreach($manyArrays as $arr ) {
  $uniques = array_unique(array_merge($uniques, $arr));
}
Run Code Online (Sandbox Code Playgroud)

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

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

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

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