У меня есть эта коллекция:
$stocks = collect(
[
['sku' => '123', 'batch' => '123', 'qty_total' => 1],
['sku' => '1233', 'batch' => '123', 'qty_total' => 2],
['sku' => '123', 'batch' => '123', 'qty_total' => 3],
['sku' => '5', 'batch' => '123', 'qty_total' => 4],
]
);
И мне нужно получить коллекцию выходных данных следующим образом:
[
['sku' => '123', 'batch' => '123', 'qty_total' => 4],
['sku' => '1233', 'batch' => '123', 'qty_total' => 2],
['sku' => '5', 'batch' => '123', 'qty_total' => 4],
]
Я группирую коллекцию с
$coll = $coll
->groupBy(['sku','batch'], true)
Но я не понимаю, как мне суммировать дальше.
да, но я хочу сделать это с помощью методов сбора laravel
Отвечает ли это на ваш вопрос? Коллекция Laravel с группировкой, подсчетом и суммированием






Вы можете сделать это следующим образом:
$stocks = collect(
[
['sku' => '123', 'batch' => '123', 'qty_total' => 1],
['sku' => '1233', 'batch' => '123', 'qty_total' => 2],
['sku' => '123', 'batch' => '123', 'qty_total' => 3],
['sku' => '5', 'batch' => '123', 'qty_total' => 4],
]
);
return $stocks->groupBy(['sku','batch'], true)->map(function($items){
$firstItem = $items->values()->first();
return collect($firstItem->first())->merge([
'qty_total' => $firstItem->sum('qty_total')
]);
})->values();
Однако есть одна ошибка: если у меня все еще есть ключ, код Manufacturing_date будет работать некорректно.
Извините за это, покажите мне новый ввод, пожалуйста, и в чем проблема, я постараюсь вам помочь.
Мне нужно сделать это и сгруппировать для динамического массива groupBy, для группировки может быть более двух элементов.
Вот это с Manufacturing_date 3v4l.org/bVqEN6
Передача двухэлементного массива в метод groupBy() только увеличивает объем работы/обработки, потому что генерирует излишне глубокую структуру. Обратите внимание, как фрагмент Мохаммеда должен переиндексироваться (values()), затем вызывать first(), затем снова first(), чтобы перейти на желаемый уровень.
Вместо этого передайте groupBy() функцию обратного вызова, чтобы сформировать «ключ составной строки» и сохранить сгруппированные данные поверхностными.
Код: (Демо-версия PHPize)
var_export(
$stocks
->groupBy(fn($row) => $row['sku'] . '_' . $row['batch'])
->map(fn($set) => array_merge($set->first(), ['qty_total' => $set->sum('qty_total')]))
->values()
->toArray()
);
Выход:
array (
0 =>
array (
'sku' => '123',
'batch' => '123',
'qty_total' => 4,
),
1 =>
array (
'sku' => '1233',
'batch' => '123',
'qty_total' => 2,
),
2 =>
array (
'sku' => '5',
'batch' => '123',
'qty_total' => 4,
),
)
Тематически связанный контент:
Ага! Это решение работает для группы с более чем двумя ключами!
Отвечает ли это на ваш вопрос ? stackoverflow.com/questions/37675819/…