Преобразовать массив PHP

Array
(
    [0] => Array
        (
            [code] => Сэндвич-панель кровельная ППС12Неопор 10000(+150) 1000 100 RAL5005 - / RAL1000 Трапеция
            [quantity] => 10
            [square] => 100.00000
            [price_per_meter] => 1700
            [cost] => 170000.00
        )

    [1] => Array
        (
            [code] => Сэндвич-панель кровельная ППС12Неопор 10000(+150) 1000 100 RAL5005 - / RAL1000 Трапеция
            [quantity] => 5
            [square] => 50.00000
            [price_per_meter] => 1700
            [cost] => 85000.00
        )

    [2] => Array
        (
            [code] => Сэндвич-панель кровельная ППС12Неопор 10000(+150) 1000 100 RAL5005 - / RAL1000 Трапеция
            [quantity] => 11
            [square] => 110.00000
            [price_per_meter] => 1700
            [cost] => 187000.00
        )

    [3] => Array
        (
            [code] => Сэндвич-панель стеновая ППУ 10000 1000 100 RAL1000 Гладкий / RAL1000 Гладкий
            [quantity] => 10
            [square] => 100.00000
            [price_per_meter] => 2250
            [cost] => 225000.00
        )

    [4] => Array
        (
            [code] => Сэндвич-панель стеновая ППУ 10000 1000 100 RAL1000 Гладкий / RAL1000 Гладкий
            [quantity] => 5
            [square] => 50.00000
            [price_per_meter] => 2250
            [cost] => 112500.00
        )

    [5] => Array
        (
            [code] => Сэндвич-панель стеновая ППУ 10000 1000 100 RAL1000 Гладкий / RAL1000 Гладкий
            [quantity] => 11
            [square] => 110.00000
            [price_per_meter] => 2250
            [cost] => 247500.00
        )

    [6] => Array
        (
            [code] => Нащельник объёмный НО 100 L2500 (1000)
            [quantity] => 10
            [square] => 5.25000
            [price_per_meter] => 700
            [cost] => 3675.00
        )

    [7] => Array
        (
            [code] => Швеллер Ш 102 L1750 (1000)
            [quantity] => 5
            [square] => 1.86000
            [price_per_meter] => 700
            [cost] => 1302.00
        )

    [8] => Array
        (
            [code] => Швеллер Ш 102 L1750 (1000)
            [quantity] => 5
            [square] => 1.86000
            [price_per_meter] => 700
            [cost] => 1302.00
        )

    [9] => Array
        (
            [code] => Болт-саморез HSP-R 185мм
            [quantity] => 100
            [square] => 0
            [price_per_meter] => 15.50
            [cost] => 1550.00
        )

    [10] => Array
        (
            [code] => Болт-саморез HSP-R 185мм
            [quantity] => 150
            [square] => 0
            [price_per_meter] => 15.50
            [cost] => 2325.00
        )

)

Здравствуйте все. Немогу сообразить, как в приведенном массиве просуммировать ['quantity'], ['square'] и ['cost'] у элементов с одинаковым ['code'], и записать в другой массив только уникальные по ключу ['code'] элементы с просуммированными значениями.


Ответы (1 шт):

Автор решения: Alex Nem

Например как-то так?

    $array = [
        0 => [
            'code' => "11111",
            'quantity' => 10,
            'square' => 100,
            'price_per_meter' => 170,
            'cost' => 170
        ],
        1 => [
            'code' => "11111",
            'quantity' => 10,
            'square' => 100,
            'price_per_meter' => 170,
            'cost' => 170
        ],
        2 => [
            'code' => "123",
            'quantity' => 10,
            'square' => 100,
            'price_per_meter' => 170,
            'cost' => 170
        ],
        3 => [
            'code' => "456",
            'quantity' => 10,
            'square' => 100,
            'price_per_meter' => 170,
            'cost' => 170
        ],
    ];

    // Итоговый массив
    $result = [];

    // Пройти по исходному массиву
    foreach($array as $key => $item)
    {
        // Используем code как индекс нового массива
        $index = $item['code'];
        
        // Если нет эелемента с таким индексом - добавляем
        if(empty($result[$index]))
        {
            $result[$index] = $item;
        }
        // Если есть - суммируем
        else
        {
            $result[$index]['quantity'] += $item['quantity'];
            $result[$index]['cost'] += $item['cost'];
            $result[$index]['square'] += $item['square'];
        }
    }

    // Если нужен проиндексированный числами массив
    $result = array_values($result);
→ Ссылка