如何在 PHP 中合并两个对象数组
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/11877586/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
How to merge two arrays of object in PHP
提问by M. Ahmad Zafar
I have the following two arrays of objects:
我有以下两个对象数组:
First Array:$array1
第一个数组:$array1
Array
(
[0] => stdClass Object
(
[id] => 100
[name] => Muhammad
)
[1] => stdClass Object
(
[id] => 102
[name] => Ibrahim
)
[2] => stdClass Object
(
[id] => 101
[name] => Sumayyah
)
)
Second Array:$array2
第二个数组:$array2
Array
(
[0] => stdClass Object
(
[id] => 100
[name] => Muhammad
)
[1] => stdClass Object
(
[id] => 103
[name] => Yusuf
)
)
I want to merge these two object arrays (removing all duplicates) and sorted according to id.
我想合并这两个对象数组(删除所有重复项)并根据id.
Desired output:
期望的输出:
Array
(
[0] => stdClass Object
(
[id] => 100
[name] => Muhammad
)
[1] => stdClass Object
(
[id] => 101
[name] => Sumayyah
)
[2] => stdClass Object
(
[id] => 102
[name] => Ibrahim
)
[3] => stdClass Object
(
[id] => 103
[name] => Yusuf
)
)
回答by M. Ahmad Zafar
These 3 simple steps did the work:
这 3 个简单的步骤完成了工作:
//both arrays will be merged including duplicates
$result = array_merge( $array1, $array2 );
//duplicate objects will be removed
$result = array_map("unserialize", array_unique(array_map("serialize", $result)));
//array is sorted on the bases of id
sort( $result );
Note:Answer by @Kamran helped me come to this simple solution
注意:@Kamran 的回答帮助我找到了这个简单的解决方案
回答by Software Guy
UPDATE
更新
I am posting the entire code listing here now instead of the previously posted main code, printing both input and output. You can simply copy and paste this code to test.
我现在在这里发布整个代码清单,而不是以前发布的主要代码,打印输入和输出。您可以简单地复制并粘贴此代码进行测试。
<?php
function array_to_object($arr) {
$arrObject = array();
foreach ($arr as $array) {
$object = new stdClass();
foreach ($array as $key => $value) {
$object->$key = $value;
}
$arrObject[] = $object;
}
return $arrObject;
}
function super_unique($array)
{
$result = array_map("unserialize", array_unique(array_map("serialize", $array)));
foreach ($result as $key => $value) {
if ( is_array($value) ) {
$result[$key] = super_unique($value);
}
}
return $result;
}
function merge_arrays($arr1, $arr2) {
$arr1 = (array)$arr1;
$arr2 = (array)$arr2;
$output = array_merge($arr1, $arr2);
sort($output);
return super_unique($output);
}
$array1 = array(
array("id" => "100", "name" => "muhammad"),
array("id" => "102", "name" => "ibrahim"),
array("id" => "101", "name" => "summayyah"),
);
$array1 = array_to_object($array1);
print "<h3>Your array 1</h3>";
print "<pre>";
print_r($array1);
print "</pre>";
$array2 = array(
array("id" => "100", "name" => "muhammad"),
array("id" => "103", "name" => "yusuf"),
);
$array2 = array_to_object($array2);
print "<h3>Your array 2</h3>";
print "<pre>";
print_r($array2);
print "</pre>";
$result = merge_arrays($array1, $array2);
print "<h3>Your desired output</h3>";
print "<pre>";
print_r($result);
print "</pre>";
it will output the following:
它将输出以下内容:
Your array 1
Array
(
[0] => stdClass Object
(
[id] => 100
[name] => muhammad
)
[1] => stdClass Object
(
[id] => 102
[name] => ibrahim
)
[2] => stdClass Object
(
[id] => 101
[name] => summayyah
)
)
Your array 2
Array
(
[0] => stdClass Object
(
[id] => 100
[name] => muhammad
)
[1] => stdClass Object
(
[id] => 103
[name] => yusuf
)
)
Your desired output
Array
(
[0] => stdClass Object
(
[id] => 100
[name] => muhammad
)
[2] => stdClass Object
(
[id] => 101
[name] => summayyah
)
[3] => stdClass Object
(
[id] => 102
[name] => ibrahim
)
[4] => stdClass Object
(
[id] => 103
[name] => yusuf
)
)
回答by mickmackusa
Assignments:
作业:
- Merge
- Remove Duplicates
- Sort by
id
- 合并
- 删除重复项
- 排序方式
id
The good news is: Assigning temporary keys using idvalues does all of the hard work for you.No serializing is needed.
好消息是:使用id值分配临时键可以为您完成所有艰苦的工作。不需要序列化。
array_merge()joins the arrays together.array_column()with anull2nd parameter leaves the objects unmodified andidas the 3rd parameter assigns the temporary keys. Because arrays cannot have duplicate keys, duplicate objects are weeded out in this step.- Now that we have keys,
ksort()avoids calling the more convolutedusort()to sort byidascending. - Finally, call
array_values()to re-index the resultant array (remove the temporary keys).
array_merge()将数组连接在一起。array_column()使用null第二个参数使对象保持不变,而id作为第三个参数分配临时键。因为数组不能有重复的键,所以在这一步中会淘汰重复的对象。- 现在我们有了键,
ksort()避免调用更复杂的usort()按id升序排序。 - 最后,调用
array_values()重新索引结果数组(删除临时键)。
Code: (Demo)
代码:(演示)
$array1 = [
(object) ['id' => 100, 'name' => 'Muhammad'],
(object) ['id' => 102, 'name' => 'Ibrahim'],
(object) ['id' => 101, 'name' => 'Sumayyah']
];
$array2 = [
(object) ['id' => 100, 'name' => 'Muhammad'],
(object) ['id' => 103, 'name' => 'Yusuf']
];
$merged_keyed = array_column(array_merge($array1,$array2), NULL, 'id');
ksort($merged_keyed);
print_r(array_values($merged_keyed));
Output:
输出:
Array
(
[0] => stdClass Object
(
[id] => 100
[name] => Muhammad
)
[1] => stdClass Object
(
[id] => 101
[name] => Sumayyah
)
[2] => stdClass Object
(
[id] => 102
[name] => Ibrahim
)
[3] => stdClass Object
(
[id] => 103
[name] => Yusuf
)
)

