Search code examples
phparrayslaravelsortingarray-merge

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.


Solution

  • 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',
        ),
      ),
    )