【问题标题】:PHP - merge properties of objects in two arrays by a certain propertyPHP - 通过某个属性合并两个数组中对象的属性
【发布时间】:2019-01-15 15:05:54
【问题描述】:

我有两个数组:

Array
(
    [0] => stdClass Object
        (
            [data] => 0
            [duration] => 1382
            [month] => 3
        )

    [1] => stdClass Object
        (
            [data] => 0
            [duration] => 2649
            [month] => 4
        )

    [2] => stdClass Object
        (
            [data] => 176.30260467529297
            [duration] => 3312
            [month] => 5
        )

    [3] => stdClass Object
        (
            [data] => 2214.396824836731
            [duration] => 0
            [month] => 6
        )

    [4] => stdClass Object
        (
            [data] => 3762.13547706604
            [duration] => 3394
            [month] => 8
        )

)
Array
(
    [0] => stdClass Object
        (
            [count1] => 2426
            [count2] => 66
            [month] => 5
        )

    [1] => stdClass Object
        (
            [count1] => 7550
            [count2] => 773
            [month] => 6
        )

    [2] => stdClass Object
        (
            [count1] => 13288
            [count2] => 1536
            [month] => 7
        )

    [3] => stdClass Object
        (
            [count1] => 3596
            [count2] => 762
            [month] => 8
        )

)

我想合并它们,以便给定month 的所有属性都在一起。期望的结果:

Array
(
    [0] => stdClass Object
        (
            [data] => 0
            [duration] => 1382
            [month] => 3
        )

    [1] => stdClass Object
        (
            [data] => 0
            [duration] => 2649
            [month] => 4
        )

    [2] => stdClass Object
        (
            [data] => 176.30260467529297
            [duration] => 3312
            [count1] => 2426
            [count2] => 66
            [month] => 5
        )

    [3] => stdClass Object
        (
            [data] => 2214.396824836731
            [duration] => 0
            [count1] => 7550
            [count2] => 773
            [month] => 6
        )

    [4] => stdClass Object
        (
            [count1] => 13288
            [count2] => 1536
            [month] => 7
        )

    [5] => stdClass Object
        (
            [data] => 3762.13547706604
            [duration] => 3394
            [count1] => 3596
            [count2] => 762
            [month] => 8
        )

)

当然,我想我可以通过两个讨厌的循环来做到这一点,通过将月份设置为公共表的键并将所有内容都塞进去,我猜。我一直在寻找更优雅的解决方案。

【问题讨论】:

  • 将月份作为键和数组而不是对象,这将是对 array_merge_recursive() 的简单调用。
  • 当然但是...如果我必须进行循环以将两个对象数组转换为以months为键的数组,我不妨在循环中进行合并工作不要您认为 ? :D
  • 这在一定程度上取决于数据源是什么。

标签: php arrays multidimensional-array merge


【解决方案1】:

我想这可能对你有帮助, 假设您有两个对象数组 $data 和 $data1,

$finalData = []; // to store final result 
$monthArray = array_column($data1, 'month');

foreach ($data as $index=>$row) {

    $key = array_search($row->id, $monthArray);

    if ($key!==false) {
        $finalData[$index] = (object) array_merge((array) $row, (array) $data1[$key]);
        unset($data1[$key]);
        unset($data[$index]);
        unset($monthArray[$key]);
    }
}

if (count($data)) {
     $finalData = array_merge($finalData, $data);
}

if (count($data1)) {
     $finalData = array_merge($finalData, $data1);
}


print_r($finalData);

请查看并让我知道,以防有帮助或我错过了任何案例。

谢谢。

【讨论】:

  • 谢谢,但这并不是比我所拥有的更优雅的方式。感谢您的尝试!
【解决方案2】:

这会重现您的对象数组:

$array1=Array
(

       (object) array(
            'data' => 0,
            'duration' => 1382,
            'month' => 3,
        ),

     (object)array
        (
            'data' => 0,
            'duration' => 2649,
            'month' => 4,
        )

   ,

     (object)array(
            'data' => 176.30260467529297,
            'duration' => 3312,
            'month' => 5,
        )

    ,

    (object)array(
            'data' => 2214.396824836731,
            'duration' => 0,
            'month' => 6,
        )

    ,

     (object)array(
            'data' => 3762.13547706604,
            'duration' => 3394,
            'month' => 8,
        )

);

$array2=Array
(


     (object)array(
            'count1' => 2426,
            'count2' => 66,
            'month' => 5,
        )

    ,

     (object)array(
            'count1' => 7550,
            'count2' => 773,
            'month' => 6,
        )

   ,

     (object)array(
            'count1' => 13288,
            'count2' => 1536,
            'month' => 7,
        )

   ,

     (object)array(

            'count1' => 3596,
            'count2' => 762,
            'month' => 8,
        )

);

这实现了基于月份属性的合并:

$merged=[];

foreach($array1 as $key=> $object1){
    $no_match=true;
    foreach($array2 as $object2){
        if($object1->month===$object2->month){
            $data[$key]=(object)array_merge((array)$object1,(array)$object2);
            $no_match=false;
            break;
        }

    }
    if($no_match)
        $data[$key]=$object1;
}

var_dump($data);

输出是:

array(5) {
  [0]=>
  object(stdClass)#1 (3) {
    ["data"]=>
    int(0)
    ["duration"]=>
    int(1382)
    ["month"]=>
    int(3)
  }
  [1]=>
  object(stdClass)#2 (3) {
    ["data"]=>
    int(0)
    ["duration"]=>
    int(2649)
    ["month"]=>
    int(4)
  }
  [2]=>
  object(stdClass)#10 (5) {
    ["data"]=>
    float(176.30260467529)
    ["duration"]=>
    int(3312)
    ["month"]=>
    int(5)
    ["count1"]=>
    int(2426)
    ["count2"]=>
    int(66)
  }
  [3]=>
  object(stdClass)#11 (5) {
    ["data"]=>
    float(2214.3968248367)
    ["duration"]=>
    int(0)
    ["month"]=>
    int(6)
    ["count1"]=>
    int(7550)
    ["count2"]=>
    int(773)
  }
  [4]=>
  object(stdClass)#12 (5) {
    ["data"]=>
    float(3762.135477066)
    ["duration"]=>
    int(3394)
    ["month"]=>
    int(8)
    ["count1"]=>
    int(3596)
    ["count2"]=>
    int(762)
  }
}

【讨论】:

  • 谢谢,正如我在帖子末尾所说的那样,做两个循环很容易 - 我一直在寻找一种可能更优雅的方法,但我想没有。
猜你喜欢
  • 2019-02-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-31
  • 2019-06-05
  • 2021-01-13
  • 2017-11-28
  • 1970-01-01
相关资源
最近更新 更多