$new_arr=array(); foreach ($products as $key => $value) { $product_id=$value['product_id']; $quantity=$value['quantity']; $price=$value['price']; if (array_key_exists($product_id, $new_arr)) { $new_quantity=$new_arr[$product_id]['quantity']+$quantity; $new_arr[$product_id]['quantity']=$new_quantity; $new_arr[$product_id]['total']=$new_quantity*$price; } else { $new_arr[$product_id]['quantity']=$quantity; $new_arr[$product_id]['price']=$price; $new_arr[$product_id]['total']=$quantity*$price; } }
Initially, it would be necessary to do the array keys not with an order in sequence, but with a unique product ID. It would take a lot of trouble. And the currency should be stored separately ($ 200 * 2 does not count).
Added based on comments
$products=Array( '0' => Array ( 'product_id' => '47', 'quantity' => '5', 'price' => '200.00', 'total' => '1000.00', 'thumb' => 'thumb.00', 'name' => 'name.00', 'model' => 'model.00', 'size' => '34' ), '1' => Array ( 'product_id' => '47', 'quantity' => '2', 'price' => '200.00', 'total' => '400.00', 'thumb' => 'thumb.00', 'name' => 'name.00', 'model' => 'model.00', 'size' => '56' ) ); $new_arr=array(); $balast_values_names=array(1 => 'thumb', 2 => 'name', 3 => 'model'); // тут все статичные переменные foreach ($products as $key => $value) { $product_id=$value['product_id']; $quantity=$value['quantity']; $price=$value['price']; /* Играем на свойстве ключей массивов - может быть только один уникальный ключ. И в качестве ключа берём product_id. Перебираем циклом (немного выше мы уже начали перебор) все значения исходного массива. И формируем новый. Ключами нового массива будет product_id исходного. Таким образом, если встретим в исходном массиве два товара с одним product_id, то более новый перезапишет более старый в новом массиве. А нам нужно сохранить все данные. Особеннно количество товаров. Потому array_key_exists($product_id, $new_arr) проверяет, есть ли у нас в новом массиве уже значение ключа равное product_id из исходого массива Если есть, до дополняем в новом массиве его дополнительными данными из старого (добавляем количество заказов, пересчитываем стоимость и т.п.) Если нет, то просто добавляем все данные */ if (array_key_exists($product_id, $new_arr)) { $new_quantity=$new_arr[$product_id]['quantity']+$quantity; $new_arr[$product_id]['quantity']=$new_quantity; $new_arr[$product_id]['total']=$new_quantity*$price; //это код для размеров обуви (если от размера не зависит цена) $want_to_add_in_array_size=$value['size']; //тут смотрим, если размер обуви, который хотим добавить не совпадает с теми, что уже есть в новом массиве, то добавляем его. А если совпадает, то ничего не делаем if (!in_array($want_to_add_in_array_size, $new_arr[$product_id]['size'])) { $new_arr[$product_id]['size'][]=$want_to_add_in_array_size; } } else { $new_arr[$product_id]['quantity']=$quantity; $new_arr[$product_id]['price']=$price; $new_arr[$product_id]['total']=$quantity*$price; //если каждый ИД товара - уникальная единица, то (размеры предусмотрены ниже) //переносим все значения статичным переменных foreach ($balast_values_names as $key2 => $balast) { $new_arr[$product_id][$balast]=$value[$balast]; } //размеры загоняем сюда (если от размера не зависит стоимость, конечно) $new_arr[$product_id]['size'][]=$value['size']; } } print_r($products); echo '<br><br><br>'; print_r($new_arr);
As a result, we get
Array ( [47] => Array ( [quantity] => 7 [price] => 200.00 [total] => 1400 [thumb] => thumb.00 [name] => name.00 [model] => model.00 [size] => Array ( [0] => 34 [1] => 56 ) ) )