Довольно просто сделать с al oop.
//create new array to hold new array format
$new_array = [];
//loop through old array
foreach($old_array as $value) {
//check if $value['id'] key exists in `$new_array`
if(!array_key_exists($value['id'], $new_array)) {
//if key does not exist, create it
$new_array[$value['id']] = $value;
} else {
//if key does already exist, increment quantity
$new_array[$value['id']]['quantity'] += $value['quantity'];
}
}
Вывод из вашего примера массива:
Array
(
[11399] => Array
(
[id] => 11399
[groupid] => 18
[name] => Morphite
[quantity] => 150
)
[16673] => Array
(
[id] => 16673
[groupid] => 429
[name] => Fernite Carbide
[quantity] => 83
)
[16678] => Array
(
[id] => 16678
[groupid] => 429
[name] => Sylramic Fibers
[quantity] => 11
)
[16680] => Array
(
[id] => 16680
[groupid] => 429
[name] => Phenolic Composites
[quantity] => 6
)
[33361] => Array
(
[id] => 33361
[groupid] => 429
[name] => Plasmonic Matamaterials
[quantity] => 2
)
[16681] => Array
(
[id] => 16681
[groupid] => 429
[name] => Nanotransistors
[quantity] => 2
)
)
Если вы хотите, чтобы ключи в этом выходном массиве были последовательными числами по какой-то причине вы можете добиться этого, используя array_values($new_array)
после l oop.