-2

This is my multidimensional array example. This is generated through a form so this is a dynamic array, so there may be more than 3 entries.

$array = 
[
    [
        'itemNo' => 1,
        'desc' => [
            ['serialNo' => 1, 'name' => 'a'],
            ['serialNo' => 2, 'name' => 'b']
        ],
        'quantity' => 2
    ],
    [
        'itemNo' => 2,
        'desc' => [
            ['serialNo' => 1, 'name' => 'a1'],
        ],
        'quantity' => 1
    ],
    [
        'itemNo' => 1,
        'desc' => [
            ['serialNo' => 3, 'name' => 'c']
        ],
        'quantity' => 1
    ]
];

I want to merge these arrays by key [itemNo]. In this example Array[0] and Array[2] have the same key '1'.

This result I want is...

$merged = 
[
    [
        'itemNo' => 1,
        'desc' => [
            ['serialNo' => 1, 'name' => 'a'],
            ['serialNo' => 2, 'name' => 'b']
            ['serialNo' => 3, 'name' => 'c']
        ],
        'quantity' => 3
    ],
    [
        'itemNo' => 2,
        'desc' => [
            ['serialNo' => 1, 'name' => 'a1'],
        ],
        'quantity' => 1
    ],
];
Don't Panic
  • 41,125
  • 10
  • 61
  • 80
user2122151
  • 51
  • 2
  • 8

1 Answers1

0

As always for grouping problems like these, use itemNo as the key in the grouped array you're trying to generate.

foreach ($your_array as $x) {
    $id = $x['itemNo'];  // set the key


    if (isset($grouped[$id])) {

        // increment if that id is already set
        $grouped[$id]['desc'] = array_merge($grouped[$id]['desc'], $x['desc']);
        $grouped[$id]['quantity'] += $x['quantity'];
    } else {

        // add the entire entry if not
        $grouped[$id] = $x;
    }   
}
Don't Panic
  • 41,125
  • 10
  • 61
  • 80