我需要将两个数组合并为一个数组,但我需要的是在它们共有的主数据之前删除(我的意思是重复值),合并时我只需要唯一的值。
我该怎么做?
这是数组示例:
第一个数组
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"
}
}
答案 0 :(得分:135)
您可以将array_merge()
函数与array_unique()
函数结合使用(这两个标题都是不言自明的)
$array = array_unique (array_merge ($array1, $array2));
答案 1 :(得分: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);
返回
Array
(
[0] => 1
[1] => 2
[2] => 3
[5] => 5
[6] => 6
[7] => 7
)
答案 2 :(得分: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 :(得分:1)
一个较晚的答案,但我只是发现数组联合运算符+
做得很好(在第3部分中找到here)。
$array1 + $array2 = $array //if duplicate found, the value in $array1 will be considered ($array2 value for array_merge, if keys clearly specified)
答案 4 :(得分:1)
我一直在做我可以想象的所有方式的一些基准测试。我对堆叠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%)慢很多。第一个选项不支持严格类型检查。