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

j0pj023g  于 2022-12-06  发布在  其他
关注(0)|答案(3)|浏览(255)

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

c2e8gylq1#

通过使用CodeIgniter的->result()而不是->result_array(),您已经使一个相对基本的任务变得更加困难。如果您有数组的数组,那么您可以只使用array_map('array_merge', $array1, $array2),但这不适用于您的对象数组。
相反,您需要在每个对象上调用get_object_vars()(并且您将在外部array_map()中迭代多个对象。
从本质上讲,此任务是同时迭代两个数组,将每对对象转换为数组类型,然后合并数组,再将合并后的数组转换回对象类型。
下面的代码段设计为具有处理2个或更多对象数组的灵活性。
代码:(Demo

var_export(
    array_map(
        fn(...$objs) => (object) array_merge(...array_map('get_object_vars', $objs)),
        $array1,
        $array2
    )
);

当只有两个对象数组被合并时,上面的代码可以写得更简洁一些。(Demo

var_export(
    array_map(
        fn($obj1, $obj2) => (object) array_merge((array) $obj1, (array) $obj2),
        $array1,
        $array2
    )
);

可以使用经典的嵌套foreach方法来避免在合并时强制转换和重新强制转换数据类型。array_merge()array_merge_recursive()(当前)不能用于将对象合并在一起--它们的属性必须在接收对象中单独定义。(Demo

$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,
  ),
)
bvjveswy

bvjveswy2#

您需要将array_maparray_merge沿着使用,如下所示

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

dnph8jn43#

您可以输入类似以下的内容:
让我们假设$a是第一个数组,$B是第二个数组,$c是您想要的输出。

$c = array();
for($i=0;$i<count($a);$i++){
    $c[$i] = array_merge($a[$i],$b[$i]);
}

相关问题