PHP - подсчитать сумму конкретных элементов в многомерном массиве

Столкнулся с не стандартной задачей. В корзине интернет-магазина Opencart 3 товары приходят обычным массивом. Первая задача была отсортировать их по производителям и выделить название производителя на верхний уровень массива, чтобы получилась группа и подгруппа.

Имя производителя
Товар 1
Товар 2
Товар 3

Эта задача была решена так:

usort($data['products'], function($a, $b) {
    return $a['manufacturer'] <=> $b['manufacturer'];
});

$res = [];
foreach ($data['products'] as $x) {
   $res[$x['manufacturer']][] = $x;
}

Далее стоит вторая задача. Вывести название группы товаров (Это имя производителя) и сумму этих товаров, чтобы выглядело так:

Имя магазина 1 - 343$
Имя магазина 2 - 678$
...

Для этого вношу изменения в предыдущий код.

$res = [];
foreach ($data['products'] as $x) {
   $res[$x['manufacturer']][] = $x['price'];
}

И получаю такой массив:

Array
(
    [Bykilian] => Array
        (
            [0] => 179.00 $
            [1] => 80.00 $
            [2] => 108.00 $
        )

    [Kidsnail] => Array
        (
            [0] => 194.00 $
        )

    [Longstormaier] => Array
        (
            [0] => 199.00 $
            [1] => 150.00 $
            [2] => 84.00 $
        )

)

Теперь нужно как то посчитать сумму в каждой группе и вывести ее во фронт энд. На этом этапе встрял. У кого то будут идеи?


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

Автор решения: RifmaMan

Вы можете подсчитывать сумму изделий при добавлении (если цена является лишь числом, без символа $):

$res = [];
foreach ($data['products'] as $x) {
   $res[$x['manufacturer']]['products'][] = $x['price'];
   $res[$x['manufacturer']]['products_sum'] = (isset($res[$x['manufacturer']]['products_sum'])) ? $res[$x['manufacturer']]['products_sum'] + $x['price'] : $x['price'];
}

В таком случае, массив получится следующего вида:

Array
(
    [Bykilian] => Array
        (
            [products] => Array
                (
                    [0] => 179.00
                    [1] => 80.00
                    [2] => 108.00
                )
            [products_sum] => 367.00
        )
)

З.Ы. Если вы храните цены с символом $, вы можете перед сложением используя регулярные выражения взять только число чтобы php сделал сложение, в таком случае при выводе в бэкэнд вам придется дописывать знак $.

→ Ссылка