PHP - 合并两个数组为一个数组(同时删除重复项)

131

你好,我正在尝试合并两个数组,并希望从最终的数组中删除重复的值。

这是我的数组 1:

Array
    (
    [0] => stdClass Object
    (
    [ID] => 749
    [post_author] => 1
    [post_date] => 2012-11-20 06:26:07
    [post_date_gmt] => 2012-11-20 06:26:07
)

这是我的数组2:
Array
(
[0] => stdClass Object
(
[ID] => 749
[post_author] => 1
[post_date] => 2012-11-20 06:26:07
[post_date_gmt] => 2012-11-20 06:26:07

)

我正在使用array_merge将两个数组合并成一个数组,它的输出结果如下:

Array
(
[0] => stdClass Object
(
[ID] => 749
[post_author] => 1
[post_date] => 2012-11-20 06:26:07
[post_date_gmt] => 2012-11-20 06:26:07

[1] => stdClass Object
(
[ID] => 749
[post_author] => 1
[post_date] => 2012-11-20 06:26:07
[post_date_gmt] => 2012-11-20 06:26:07

)

我想要移除这些重复的条目,或者在合并之前可以将它们删除吗?请帮忙...谢谢!!!!!


因为您想要合并 $array1[0] 和 $array2[0] 而不是 $array1 和 $array2。尝试在每个数组的第一个项目上运行 array_merge。 - Bgi
数组是动态的..所以它不总是 $array1[0] 和 $array2[0]。 - Ravikumar Sharma
有没有什么方法可以比较数组中每个对象的ID? - Ravikumar Sharma
1
忘记我的第一条评论,那不起作用,因为你试图合并的不是数组,而是对象。你必须手动完成它。 - Bgi
9个回答

306

7
如果没有使用SORT_REGULAR,就会出现这个错误:Catchable fatal error: Object of class stdClass could not be converted to string - Ravikumar Sharma
7
值得注意的是,array_unique返回经过筛选的数组(而不是直接对传入的数组参数进行操作),因此在使用它之前需要先将结果存储起来。 - Mike
7
默认情况下,array_unique 尝试将数组值用作字符串。这就是 @Ravi 遇到错误的原因。如果您的数组仅包含字符串,则不需要第三个参数。如果它不是字符串,或者内容无法隐式转换为字符串,则需要使用 SORT_REGULAR 参数。 - David Baucum
对于数组对象,如果我们不使用 SORT_REGULAR,它会出现 Recoverable fatal error: Object of class stdClass could not be converted to string in...<path to file> 的错误。@Hemantwagh07 - mapmalith

9

正如已经提到的,array_unique() 可以用于简单数据,但是处理对象不是那么简单。

当 PHP 尝试合并数组时,它会尝试比较数组成员的值。如果成员是一个对象,它无法获取其值,而是使用 spl hash 代替。在此处阅读更多关于 spl_object_hash 的内容。

简单来说,如果你有两个对象,都是同一类的实例,如果其中一个不是对另一个的引用,那么最终将得到两个对象,无论它们的属性值如何。

为确保在合并的数组中没有重复项,我认为应该自己处理这种情况。

另外,如果要合并多维数组,请考虑使用 array_merge_recursive() 而不是 array_merge()


7
它将合并两个数组并去除重复项。
<?php
 $first = 'your first array';
 $second = 'your second array';
 $result = array_merge($first,$second);
 print_r($result);
 $result1= array_unique($result);
 print_r($result1);
 ?>

尝试此链接link1

4

尝试使用array_unique()函数。

这个函数可以消除数组列表中的重复数据。


2
你可以使用这段代码来获得所需的结果。它将删除重复项。
$a1=array("a"=>"red","b"=>"green","c"=>"blue","d"=>"yellow");
$a2=array("e"=>"red","f"=>"green","g"=>"blue");

$result=array_unique(array_merge($a1,$a2));

print_r($result);

这个答案过于简化了提问者的数据。这个任务不是关于合并扁平数组的,而是关于合并对象数组的。请在提供解决方案/演示时使用提问者的数据。 - mickmackusa

1
合并两个数组不会删除重复项,您可以尝试以下示例从两个数组中获取唯一项。
$a1=array("a"=>"red","b"=>"green","c"=>"blue","d"=>"yellow");
$a2=array("e"=>"red","f"=>"green","g"=>"blue");

$result=array_diff($a1,$a2);
print_r($result);

虽然这将仅查找唯一条目(即,两个数组中的任何内容都将被删除),但 OP 问题想要在合并后删除重复项。因此,使用您的示例,期望的结果是在两个数组组合后保留来自 red/green/blue/yellow/red/green/blue 的 red/green/blue/yellow。 - Warren Sergent

1

0
上面的最佳解决方案在使用相同的关联键时会遇到问题,array_merge()会在它们具有相同的非数字键时将数组元素合并在一起,因此不适用于以下情况。
$a1=array("a"=>"red","b"=>"green","c"=>"blue","d"=>"yellow");
$a2=array("c"=>"red","d"=>"black","e"=>"green");

如果您能够将值输出到数组的键中(例如,在Eloquent中使用pluck('name', 'id')->toArray()),则可以使用以下合并方法。
array_keys(array_merge($a1, $a2))

基本上这段代码的作用是利用array_merge()函数的行为来消除重复的键,并返回一个新的数组,其中键作为数组元素,希望能对您有所帮助。

1
这个回答过于简化了提问者的数据。这个任务不是关于合并平面数组,而是关于合并对象数组。请在提供解决方案/演示时使用提问者的数据。 - mickmackusa

0

除了上面的答案,从PHP 7.4开始,您可以使用展开运算符:

array_unique([...$arr1, ...$arr2]);

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