【问题标题】:How to merge array of objects keeping data in PHP如何合并在PHP中保存数据的对象数组
【发布时间】:2015-12-16 12:51:20
【问题描述】:

我有以下两个对象数组:

第一个数组: $array1

Array
(
    [0] => stdClass Object
        (
            [id] => 100
            [name] => John Doe
        )

    [1] => stdClass Object
        (
            [id] => 101
            [name] => Jane Smith
        )

    [2] => stdClass Object
        (
            [id] => 102
            [name] => Richard Tea
        )
)

第二个数组: $array2

Array
(
    [0] => stdClass Object
        (
            [id] => 100
            [age] => 30
            [other] => [other]
        )

    [1] => stdClass Object
        (
            [id] => 102
            [age] => 26

        )
)

我想把这两个对象数组合并,按照id排序。

期望的输出:

Array
(
    [0] => stdClass Object
        (
            [id] => 100
            [name] => John Doe
            [age] => 30
            [other] => [other]
        )

    [1] => stdClass Object
        (
            [id] => 101
            [name] => Jane Smith
        )

    [2] => stdClass Object
        (
            [id] => 102
            [name] => Richard Tea
            [age] => 26
        )
)

【问题讨论】:

  • 我不确定链接的副本是否适用于此 - 问题是询问如何合并对象数组,特别是 stdClass 对象,而不是数组。此外,我认为所需的输出中存在错误 - [age] => 26 应该是索引为 1 而不是 2 的数组的属性?
  • 正是@DarraghEnright。这个问题不是重复的,因为我问如何合并对象数组,特别是 stdClass 对象,而不是数组。相似但不重复。
  • 没问题 - 我在下面发布了答案,如果您有任何问题,请告诉我。

标签: php arrays


【解决方案1】:

这个问题被标记为重复,但我认为它不适用,因为这个问题中的数据是 stdClass() 对象的两个数组。

编辑

我的第一个答案非常愚蠢,显然我没有对其进行足够稳健的测试。感谢@splash58,他指出我实际上是通过数组索引而不是对象 ID 合并/替换。我的示例之所以有效,是因为提供的示例数据中的排序恰好匹配。哎呀... :)

因此,再次假设我们的数据数组 $first$second 我们可以通过嵌套循环和一些数组/对象转换将 $second 的值合并到 $first 中。最后,我们应用用户定义的排序来按 id 对结果进行排序;即:

foreach ($first as &$o1) {
    foreach ($second as $o2) {
        if ($o1->id === $o2->id) {
            $o1 = (object) array_merge((array) $o1, (array) $o2);
        }
    }
}

usort($first, function($a, $b) {
    return $a->id >= $b->id;
});

print_r($second);

这会产生:

Array
(
    [0] => stdClass Object
        (
            [id] => 100
            [name] => John Doe
            [age] => 30
            [other] => other
        )

    [1] => stdClass Object
        (
            [id] => 101
            [name] => Jane Smith
        )

    [2] => stdClass Object
        (
            [id] => 102
            [name] => Richard Tea
            [age] => 26
        )

)

希望这会有所帮助:)

【讨论】:

  • @splash58 我很困惑... Richard Tea 是你的真名吗?
  • :))) 您正在按索引合并数组,但应该按 id 进行
【解决方案2】:

你可以用array_merge这样试试:

由于您的数组内容是对象,因此在使用array_merge 时需要将它们转换为数组。

<?php

$arrayTemp = array();
foreach ($array1 as $key => $value){
    $arrayTemp[] = (object)array_merge((array)$array2[$key], (array)$value);
}

var_dump($arrayTemp);
?>

[概念证明]

array(2) {
  [0]=>
  object(stdClass)#5 (3) {
    ["id"]=>
    int(100)
    ["age"]=>
    int(30)
    ["name"]=>
    string(4) "John"
  }
  [1]=>
  object(stdClass)#6 (3) {
    ["id"]=>
    int(101)
    ["age"]=>
    int(40)
    ["name"]=>
    string(4) "jane"
  }
}

【讨论】:

    猜你喜欢
    • 2022-01-03
    • 1970-01-01
    • 2012-08-06
    • 2016-09-10
    • 1970-01-01
    • 2020-05-12
    • 1970-01-01
    • 1970-01-01
    • 2019-03-16
    相关资源
    最近更新 更多