Я получаю коллекцию laravel из базы данных, в которой я хочу обновить определенные значения на основе трех вычислений. Но перед выполнением вычислений я сначала проверяю, не являются ли все соответствующие элементы коллекции нулевыми. Я могу проверить, не являются ли они нулевыми, но по какой-то причине не могу получить переменную ошибки, которая имеет область видимости функции Controller, чтобы сообщить пользователю, что переменная не была установлена.

$error_arr = [];
$calculation = FertilApp::calculation($product, $farm, $agent);
$calculation->each(function ($item, $key) {
    if ($item->ha === null) {
        $error_arr[] = 'Цены были обновлены';
        $error_arr[] = 'Но расчет не был произведен, пожалуйста, обновите следующий блок:' . $item->block;
        return false;
     }
});

Переменная $error_arr возвращает пустой массив, хотя я знаю, что ключ ha является null. Альтернативой является использование обычного цикла foreach(). Я пробовал, и это работает, но я действительно хочу знать, почему это не работает.

Может ли кто-нибудь подсказать мне, почему метод коллекции each() отказывает моей переменной в доступе к значениям извне метода коллекции?

EDIT: Если я пытаюсь передать свою переменную в качестве параметра, я получаю следующее сообщение об ошибке Cannot use a scalar value as an array.

Версия Laravel: 5.6.39

Ответы (1)

Попробуйте использовать global заявление:

$calculation->each(function ($item, $key) {
   global $error_arr;

$error_arr пуст в вашем коде, потому что он не существует в области видимости обратного вызова функции вашего метода each. В отличие от других языков - например, JavaScript - переменные вне функции не доступны по умолчанию внутри функции. Подробности смотрите в документации PHP по области видимости переменных.

2022 WebDevInsider