我正在尝试合并两个CodeIgniter查询的结果。问题是这两个数组包含对象行,而array_merge()
对对象不起作用。如何合并两个对象数组。
输入:
$array1 = [
(object) [
'trainerid' => 1,
'firstname' => 'abc',
'location' => 'area',
'photo' => 'abc.jpg',
'role' => 'user',
'city' => 'bangalore',
],
(object) [
'trainerid' => 2,
'firstname' => 'abcd',
'location' => 'area',
'photo' => 'abcd.jpg',
'role' => 'user',
'city' => 'bangalore',
],
];
$array2 = [
(object) [
'rating' => 3.0000,
'users' => 0,
'review' => 0
],
(object) [
'rating' => 4.0000,
'users' => 4,
'review' => 5
]
];
期望输出:
array (
0 =>
(object) array(
'trainerid' => 1,
'firstname' => 'abc',
'location' => 'area',
'photo' => 'abc.jpg',
'role' => 'user',
'city' => 'bangalore',
'rating' => 3.0,
'users' => 0,
'review' => 0,
),
1 =>
(object) array(
'trainerid' => 2,
'firstname' => 'abcd',
'location' => 'area',
'photo' => 'abcd.jpg',
'role' => 'user',
'city' => 'bangalore',
'rating' => 4.0,
'users' => 4,
'review' => 5,
),
)
使用CodeIgniter的->result()
而不是->result_array()
,使相对基本的任务变得更加困难。如果您有数组的数组,那么您可以只使用array_map('array_merge', $array1, $array2)
,但这对您的对象数组不起作用。
相反,您需要对每个对象调用get_object_vars()
(并且您将在外部array_map()
.中迭代多个对象
本质上,这个任务是同时迭代两个数组,将每对对象强制转换为数组类型,然后合并数组,然后将合并后的数组强制转换回对象类型。
以下代码段的设计具有处理2个或多个对象数组的灵活性。
代码:(演示)
var_export(
array_map(
fn(...$objs) => (object) array_merge(...array_map('get_object_vars', $objs)),
$array1,
$array2
)
);
当只有两个对象数组被合并时,上面的内容可以写得更简洁一些。(演示)
var_export(
array_map(
fn($obj1, $obj2) => (object) array_merge((array) $obj1, (array) $obj2),
$array1,
$array2
)
);
可以使用经典的嵌套foreach方法来避免在合并时强制转换和重铸数据类型。array_merge()
和array_merge_recursive()
(目前)不能用于将对象合并在一起——它们的属性必须在接收对象中单独定义。(演示)
$result = [];
foreach ($array1 as $i => $obj1) {
$result[$i] = $obj1;
foreach ($array2[$i] as $k => $v) {
$result[$i]->$k = $v;
}
}
var_export($result);
以上任何片段的输出:
array (
0 =>
(object) array(
'trainerid' => 1,
'firstname' => 'abc',
'location' => 'area',
'photo' => 'abc.jpg',
'role' => 'user',
'city' => 'bangalore',
'rating' => 3.0,
'users' => 0,
'review' => 0,
),
1 =>
(object) array(
'trainerid' => 2,
'firstname' => 'abcd',
'location' => 'area',
'photo' => 'abcd.jpg',
'role' => 'user',
'city' => 'bangalore',
'rating' => 4.0,
'users' => 4,
'review' => 5,
),
)
您需要像一样使用array_map
和array_merge
print_r(array_map('array_merge', $arr1, $arr2));