Laravel: сумма foreach

У меня есть этот цикл foreach:

мой $items выглядит так:

array:2 [▼
  0 => array:3 [▼
    "variant_id" => "393c6c70-8cb7-11e8-815a-f9c70a1fbe8e"
    "name" => "Medicine 1"
    "quantity" => "1"
  ]
  1 => array:3 [▼
    "variant_id" => "8a80d340-e0c1-11e8-86a4-3b06d2b50e37"
    "name" => "Medicine 2"
    "quantity" => "1"
  ]
]

Теперь в моем foreach я сравниваю variant_id с моей базой данных, получаю points из этой базы данных и умножаю его на quantity Лекарств.

points для Лекарства 1 = 50

points для Лекарства 2 = 20

так что это должно быть 50 (лекарство 1 очко) умножить на 1 (количество лекарства 1) и 20 x 1 (лекарство 2), а затем сумма обоих, которая должна быть равна 70. Но когда я использую dd($sum), я получаю 50, что только для лекарства 1.

    $sum = 0;
    foreach ($items as $variants) {
        $id = $variants['variant_id'];
        $quantity = $variants['quantity'];
        $find = Activity::where('variant_id', $id)->first();
        $act_points = $find->points * $quantity;
        $sum += $act_points;
        dd($sum);
    }

Что мне здесь не хватает?

dd($sum);послеforeach.
u_mulder 23.01.2019 08:40

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

Yogendrasinh 23.01.2019 08:41
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
0
2
1 327
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Ответ принят как подходящий

Вы можете видеть dd() как Dump and Die. Это сбросит запрошенные данные и убьет скрипт. Поскольку это выполняется, сценарий завершается до того, как он сможет завершить цикл.

Вам нужно использовать dd()после foreach-loop

$sum = 0;
foreach ($items as $variants) {
    $id = $variants['variant_id'];
    $quantity = $variants['quantity'];
    $find = Activity::where('variant_id', $id)->first();
    $act_points = $find->points * $quantity;
    $sum += $act_points;
}
dd($sum);

Если вы не хотите останавливать выполнение вашего скрипта, используйте вместо этого функцию dump.

https://laravel.com/docs/5.7/helpers#method-dd

Я понимаю, что вы делаете дамп отладки (dd) внутри цикла foreach, поэтому он просто остановится после первой итерации.

Вы должны сделать dd вне цикла foreach.

Чтобы рационализировать и избежать нескольких вызовов БД, вы можете сделать следующее

$input = [
    [
        "variant_id" => "393c6c70-8cb7-11e8-815a-f9c70a1fbe8e",
        "name" => "Medicine 1",
        "quantity" => "1",
    ],
    [
        "variant_id" => "8a80d340-e0c1-11e8-86a4-3b06d2b50e37",
        "name" => "Medicine 2",
        "quantity" => "1",
    ],
];

$sum = Activity::whereIn('variant_id', array_column($input, 'variant_id'))->get()->sum(function ($s) use ($input) {
    foreach ($input as $k => $v) {
        if ($s->variant_id == $v['variant_id']) {
            return $s->points * $v['quantity'];
        }
    }
});

Это будет работать, если в массиве $input нет повторяющихся элементов по variant_id. Другими словами, если каждое значение $input[n]['variant_id'] уникально.

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