Помогите составить правильный цикл

Есть массив:

    Array
(
    [0] => Array
        (
            [id] => 3
            [name] => Freeze Monkey - Бешеный и Колючий
            [description] => Кактус
            [cat_id] => 1
            [wholesale] => 21.9
            [retail] => 30
            [count] => 1
            [label] => Freeze Monkey
        )

    [1] => Array
        (
            [id] => 4
            [name] => Freeze Monkey - Блокбастер
            [description] => Ягоды с Мятой
            [cat_id] => 1
            [wholesale] => 21.9
            [retail] => 30
            [count] => 1
            [label] => Freeze Monkey
        )

    [2] => Array
        (
            [id] => 5
            [name] => Freeze Monkey - Большой Зеленый
            [description] => Ананас
            [cat_id] => 1
            [wholesale] => 21.9
            [retail] => 30
            [count] => 1
            [label] => Freeze Monkey
        )

    [3] => Array
        (
            [id] => 6
            [name] => Freeze Monkey - Большой Трофей
            [description] => Груша
            [cat_id] => 1
            [wholesale] => 21.9
            [retail] => 30
            [count] => 1
            [label] => Freeze Monkey
        )

    [4] => Array
        (
            [id] => 7
            [name] => Freeze Monkey - Двойняшки
            [description] => Яблоко Груша
            [cat_id] => 1
            [wholesale] => 21.9
            [retail] => 30
            [count] => 2
            [label] => Freeze Monkey
        )

    [5] => Array
        (
            [id] => 8
            [name] => Freeze Monkey - Закат
            [description] => Клубника Ананас Лемонграсс
            [cat_id] => 1
            [wholesale] => 21.9
            [retail] => 30
            [count] => 1
            [label] => Freeze Monkey
        )

    [6] => Array
        (
            [id] => 9
            [name] => Freeze Monkey - Запретная Тема
            [description] => Яблоко
            [cat_id] => 1
            [wholesale] => 21.9
            [retail] => 30
            [count] => 1
            [label] => Freeze Monkey
        )

    [7] => Array
        (
            [id] => 10
            [name] => Freeze Monkey - Зеленая Лава
            [description] => Арбузный Лимонад
            [cat_id] => 1
            [wholesale] => 21.9
            [retail] => 30
            [count] => 1
            [label] => Freeze Monkey
        )

    [8] => Array
        (
            [id] => 11
            [name] => Freeze Monkey - Идеальное Утро
            [description] => Ягодный Йогурт
            [cat_id] => 1
            [wholesale] => 21.9
            [retail] => 30
            [count] => 1
            [label] => Freeze Monkey
        )

    [9] => Array
        (
            [id] => 12
            [name] => Freeze Monkey - Искусство
            [description] => Персик
            [cat_id] => 1
            [wholesale] => 21.9
            [retail] => 30
            [count] => 1
            [label] => Freeze Monkey
        )

    [10] => Array
        (
            [id] => 14
            [name] => Fill JOY 500 F16
            [description] => Ананас
            [cat_id] => 3
            [wholesale] => 10.45
            [retail] => 17
            [count] => 1
            [label] => Fill JOY
        )

    [11] => Array
        (
            [id] => 15
            [name] => Fill JOY 500 N05
            [description] => Ванильная Кола
            [cat_id] => 3
            [wholesale] => 10.45
            [retail] => 17
            [count] => 1
            [label] => Fill JOY
        )

    [12] => Array
        (
            [id] => 16
            [name] => Fill JOY 500 F48
            [description] => Черника
            [cat_id] => 3
            [wholesale] => 10.45
            [retail] => 17
            [count] => 2
            [label] => Fill JOY
        )

    [13] => Array
        (
            [id] => 17
            [name] => Fill JOY 500 N16
            [description] => Энергетик
            [cat_id] => 3
            [wholesale] => 10.45
            [retail] => 17
            [count] => 2
            [label] => Fill JOY
        )

    [14] => Array
        (
            [id] => 18
            [name] => Fill JOY 500 F47
            [description] => Ягодный Микс
            [cat_id] => 3
            [wholesale] => 10.45
            [retail] => 17
            [count] => 1
            [label] => Fill JOY
        )

    [15] => Array
        (
            [id] => 19
            [name] => Best Vape 800 3
            [description] => Зеленый чай с жасмином
            [cat_id] => 3
            [wholesale] => 15
            [retail] => 21
            [count] => 2
            [label] => Best Vape
        )

    [16] => Array
        (
            [id] => 20
            [name] => Best Vape 800 11
            [description] => Кисло-сладкая вишня
            [cat_id] => 3
            [wholesale] => 15
            [retail] => 21
            [count] => 1
            [label] => Best Vape
        )

    [17] => Array
        (
            [id] => 21
            [name] => Best Vape 800 13
            [description] => Шипучка лимон-лайм
            [cat_id] => 3
            [wholesale] => 15
            [retail] => 21
            [count] => 1
            [label] => Best Vape
        )

)

Нужно получить таблицу:

<tr><td>[label]Freeze monkey</td><td>здесь сумма всех [count] для этого [label]</td><td>здесь сумма всех [retail] для этого [label]</td></tr>
<tr><td>[label]Fill JOY</td><td>здесь сумма [count] для этого [label]</td><td>здесь сумма [retail] для этого [label]</td></tr>
<tr><td>[label]Best Vape</td><td>здесь сумма [count] для этого [label]</td><td>здесь сумма [retail] для этого [label]</td></tr>

Пробовал так вроде работает, но не правильно считает retail и мне кажется есть какая-то ошибка. Для удобства записываю результат в массив result

  $label = '';
    $count = 0;
    $retail = 0;
    $result = array();
    foreach ($select as $product) {

        if ($label == '') {
            $label = $product['label'];
        } else if ($label != $product['label']) {
            $result[] = array($label, $count, $retail);
            $label = $product['label'];
            $count = 0;
            $retail = 0;
        }
        $retail += $product['retail'];
        $count += $product['count'];
    }
    $result[] = array($label, $count, $retail);

Получаем массив:

    Array
(
    [0] => Array
        (
            [0] => Freeze Monkey
            [1] => 12
            [2] => 300
        )

    [1] => Array
        (
            [0] => Fill JOY
            [1] => 9
            [2] => 85
        )

    [2] => Array
        (
            [0] => Best Vape
            [1] => 7
            [2] => 63
        )

)

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

Автор решения: splash58
if (! function_exists('array_group')) {
    /**
     * @param object[] $arr
     * @param array|string $filelds
     * @return object[]
     */
    function array_groupby(array $arr, $fields): array
    {
        function getter($var, $col)
        {
            if (is_array($var)) {
                return $var[$col];
            }
            if (is_object($var)) {
                return $var->$col;
            }
            throw new ErrorException('array_group - Illegal array structure');
        }

        $fields = (array)$fields;
        $res = [];
        foreach ($arr as $item) {
            $point = &$res;
            foreach ($fields as $level) {
                $key = getter($item, $level);
                if (!isset($point[$key])) {
                    $point[$key] = [];
                }
                $point = &$point[$key];
            }
            $point[] = $item;
        }
        return $res;
    }
}

$groups = array_groupby($arr, 'label');

$out = [];

foreach($groups as $label=>$x) {
    $out[$label]['label'] = $label;
    $out[$label]['count'] = array_sum(array_column($x, 'count'));
    $out[$label]['retail'] = array_sum(array_column($x, 'retail'));
}

Хотя я все складываю в массив, вы можете сразу выводить в таблицу

→ Ссылка