按一级索引合并包含对象的两个数组的行


Merge rows of two arrays containing objects by first level index

我正在尝试合并两个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_maparray_merge

print_r(array_map('array_merge', $arr1, $arr2));