Недавно стала простая задача проверить все ли данные в форме заполнены и в зависимости от этого — пропускать пользователя дальше или нет. Специфика задачи была в постепенном заполнении данных через ТГ-бота с последующим сохранением в кеш. Дабы не городить цикл — решил задачу при помощи array_reduce. В этой статье пример решения задачи.
Итак на входе мы имеем простой массив, который изначально имеет такой вид:
1 2 3 4 5 6 |
[ 'name' => null, 'phone' => null, 'email' => null, 'password' => null ] |
По мере наполнения даных массив принимает такой вид:
1 2 3 4 5 6 |
[ 'name' => 'Вася Пупкин', 'phone' => '+12345678', 'email' => null, 'password' => null ] |
Т.е. данные заменяют null-ы — и в случае когда всё будет заполнено — в массиве не должно быть null-ов.
Решение задачи через array_reduce:
1 2 3 4 5 6 |
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 встретится заполненный и валидный элемент.
Не хочу сказать, что это идеальное или условно «правильное» решение — но как демонстрация работы функции и относительно лаконичное и короткое решение задачи вполне сойдет.
Надеюсь статья была полезной — удачи!