简体   繁体   中英

how to merge array with same key, value pair

how can I merge 2 array with same key, value pair in PHP below is the returned data.

array:8
  0 => array:3
    "group" => array:2
      "id" => 1
      "name" => "data 1"
    ]
    "brief" => array:5
    "tasks" => array:1
  ]
  1 => array:3
    "group" => array:2
      "id" => 1
      "name" => "data 1"
    ]
    "brief" => array:5
    "tasks" => array:1
  ]
  2 => array:3
  3 => array:3
  4 => array:3
  5 => array:3
    "group" => array:2
      "id" => 6
      "name" => "data 5"
    ]
    "brief" => array:5
    "tasks" => array:1
  ]
  6 => array:3
    "group" => array:2
      "id" => 6
      "name" => "data 5"
    ]
    "brief" => array:5
    "tasks" => array:1
  ]
  "totalHours" => "31"
]

I need to merge array[0] and array[1] same with array[5] and array[6] since they have both the same group key and value. Im using Laravel btw.

You could try something like the following. Detect which items in your array have the same group ids. Then merge those items or the keys that you want merged.

Here I'm using array_merge_recursive, but it merges the id and name fields into an array, hence replacing the group key. But do be careful here, you might wish to be more explicit in what you wish to merge. Perhaps just the tasks and brief in your case.

<?php
$items = [
    [
        'group' => [
            'id' => '23',
            'name' => 'peach'
            ],
        'tasks' => ['foo', 'bar']
    ],
    ['big', 'fat', 'mamma'],
    [
        'group' => [
            'id' => '23',
            'name' => 'peach'
            ],
        'tasks' => ['baz', 'bat']
    ],
];

$groupIds = [];
foreach($items as $key => $item) {
    if(isset($item['group'])) {
        $groupIds[$item['group']['id']][] = $key;
    }
}

foreach($groupIds as $group_id => $item_keys) {
    $merged_item = array();
    foreach($item_keys as $key) {
        $merged_item = array_merge_recursive($merged_item, $items[$key]);
        $merged_item['group'] = $items[$key]['group'];
        unset($items[$key]);
    }
    array_push($items, $merged_item);
}

var_export($items);

Output:

array (
  1 => 
  array (
    0 => 'big',
    1 => 'fat',
    2 => 'mamma',
  ),
  3 => 
  array (
    'group' => 
    array (
      'id' => '23',
      'name' => 'peach',
    ),
    'tasks' => 
    array (
      0 => 'foo',
      1 => 'bar',
      2 => 'baz',
      3 => 'bat',
    ),
  ),
)

You can use the Laravel Collection unique method .

This allows you to set a key by which to define what is unique.

You can select a nested property to merge on with the dot syntax. ie group.id .

$merged = collect($original)->unique('group.id');

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM