Помогите составить правильный цикл
Есть массив:
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'));
}
Хотя я все складываю в массив, вы можете сразу выводить в таблицу