Как получить сумму в массиве объектов в Laravel 10?

У меня есть массив объектов, в котором я хочу суммировать количество, имеющее одно и то же поле '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();

Спасибо, и, надеюсь, кто-нибудь сможет указать, чего здесь не хватает.

Это помогает stackoverflow.com/a/78611417/20415955 ?

Mohammad si abbou 13.06.2024 11:06

@Эдсон, я опубликовал свой ответ. Пожалуйста, проверьте и дайте мне знать.

Subha 13.06.2024 11:45
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Поиск нового уровня в Laravel с помощью MeiliSearch и Scout
Поиск нового уровня в Laravel с помощью MeiliSearch и Scout
Laravel Scout - это популярный пакет, который предоставляет простой и удобный способ добавить полнотекстовый поиск в ваше приложение Laravel. Он...
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
В последние годы архитектура микросервисов приобрела популярность как способ построения масштабируемых и гибких приложений. Laravel , популярный PHP...
Как построить CRUD-приложение в Laravel
Как построить CRUD-приложение в Laravel
Laravel - это популярный PHP-фреймворк, который позволяет быстро и легко создавать веб-приложения. Одной из наиболее распространенных задач в...
1
2
71
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Сделайте это. Я думаю, это сработает.

$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 13.06.2024 12:01

@Edson, в массиве могут быть некоторые объекты, у которых нет id. Если id отсутствует, удалите часть 'id'=>.. из запроса, это сработает. Пожалуйста, проверьте это и дайте мне знать.

Subha 13.06.2024 12:26

ID всегда имеет значение. Это по-прежнему не работает, если я прокомментирую идентификатор, следующая ошибка будет «Неопределенный ключ массива «штрих-код»», и когда я прокомментирую эту следующую ошибку, отобразится следующая ошибка. Спасибо

Edson 13.06.2024 12:38

@Эдсон, это id или ID?

Subha 13.06.2024 12:39

извините, это 'id' с маленькой буквы

Edson 13.06.2024 12:40
Ответ принят как подходящий

Если вы будете следовать этому циклу карты, вы должны получить ожидаемые результаты.

$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();

Другие вопросы по теме