Недавно стала простая задача проверить все ли данные в форме заполнены и в зависимости от этого — пропускать пользователя дальше или нет. Специфика задачи была в постепенном заполнении данных через ТГ-бота с последующим сохранением в кеш. Дабы не городить цикл — решил задачу при помощи array_reduce. В этой статье пример решения задачи.
Итак на входе мы имеем простой массив, который изначально имеет такой вид:
[
'name' => null,
'phone' => null,
'email' => null,
'password' => null
]
По мере наполнения даных массив принимает такой вид:
[
'name' => 'Вася Пупкин',
'phone' => '+12345678',
'email' => null,
'password' => null
]
Т.е. данные заменяют null-ы — и в случае когда всё будет заполнено — в массиве не должно быть null-ов.
Решение задачи через array_reduce:
array_reduce( $data, function( $result, $value ){
if( is_null( $value ) ){
return false;
}
return $result && true ;
}, true )
Array_reduce проходит по каждому элементу массива и, в соответствии с анонимкой, сводит его к единому значению. В моём случае это должно было быть значение true или false — т.е. все данные заполнены или нет.
Вторым параметром передается начальное значение true — т.е. считаем, что все элементы заполнены. В случае, если анонимка встречает null — возвращается false. Если нет — логическое выражение $result && true. В $result — всегда находится текущий результат выполнения, в $value — значение текущей итерации.
Таким образом, если встретится хоть один null — метод вернет false и указанное выше логическое значение никогда не поменяется на false, даже если после null встретится заполненный и валидный элемент.
Не хочу сказать, что это идеальное или условно «правильное» решение — но как демонстрация работы функции и относительно лаконичное и короткое решение задачи вполне сойдет.
Надеюсь статья была полезной — удачи!