У меня есть массив объектов, в котором я хочу суммировать количество, имеющее одно и то же поле 'barcode', и если оно имеет другое поле 'location', его следует разделить.
вот мой образец объекта
[
{
"id": 1,
"barcode": "555",
"description": "pencil",
"quantity": "3",
"location": "drawer1",
},
{
"id": 2,
"barcode": "555",
"description": "pencil",
"quantity": "1",
"location": "drawer1",
},
{
"id": 3,
"barcode": "123",
"description": "paper",
"quantity": "1",
"location": "drawer2",
},
{
"id": 4,
"barcode": "123",
"description": "paper",
"quantity": "8",
"location": "drawer2",
},
{
"id": 5,
"barcode": "123",
"description": "paper",
"quantity": "8",
"location": "drawer1",
},
]
и вот мой желаемый результат.
[
{
"id": 1,
"barcode": "555",
"description": "pencil",
"quantity": "4",
"location": "drawer1",
},
{
"id": 2,
"barcode": "123",
"description": "paper",
"quantity": "9",
"location": "drawer2",
},
{
"id": 3,
"barcode": "123",
"description": "paper",
"quantity": "8",
"location": "drawer1",
},
]
просто для дополнительной информации, я получил этот код из своего предыдущего вопроса, но теперь не знаю, как интегрировать это поле location.
$collection
->groupBy('barcode')
->map(fn ($group, $key) => [
'id' => $group->first()['id'],
'barcode' => $group->first()['barcode'],
'description' => $group->first()['description'],
'qty' => $group->sum('qty'),
])
->values();
Спасибо, и, надеюсь, кто-нибудь сможет указать, чего здесь не хватает.
@Эдсон, я опубликовал свой ответ. Пожалуйста, проверьте и дайте мне знать.






Сделайте это. Я думаю, это сработает.
$collection
->groupBy(['barcode','location'])
->map(fn ($group, $key) => [
'id' => $group->first()['id'],
'barcode' => $group->first()['barcode'],
'description' => $group->first()['description'],
'qty' => $group->sum('quantity'),
'location' => $group->first()['location'],
])
->values();
Для получения дополнительной информации о том, как работает collections, вы можете перейти по этой ссылке, где вы получите четкое представление о том, как работать с collections.
https://laravel.com/docs/11.x/collections#extending-collections
спасибо за ваш отзыв, я попробовал ваш код, но получаю ошибку «Неопределенный ключ массива «id»»
@Edson, в массиве могут быть некоторые объекты, у которых нет id. Если id отсутствует, удалите часть 'id'=>.. из запроса, это сработает. Пожалуйста, проверьте это и дайте мне знать.
ID всегда имеет значение. Это по-прежнему не работает, если я прокомментирую идентификатор, следующая ошибка будет «Неопределенный ключ массива «штрих-код»», и когда я прокомментирую эту следующую ошибку, отобразится следующая ошибка. Спасибо
@Эдсон, это id или ID?
извините, это 'id' с маленькой буквы
Если вы будете следовать этому циклу карты, вы должны получить ожидаемые результаты.
$data = collect(json_decode($jsonInput, true));
$grouped = $data->groupBy(function ($item) {
return $item['barcode'] . '_' . $item['location'];
})->map(function ($group) {
return [
'id' => $group->first()['id'],
'barcode' => $group->first()['barcode'],
'description' => $group->first()['description'],
'quantity' => $group->sum('quantity'),
'location' => $group->first()['location'],
];
})->values()->each(function ($item, $index) {
$item['id'] = $index + 1;
});
$jsonOutput = $grouped->toJson();
Это помогает stackoverflow.com/a/78611417/20415955 ?