Следующая операция называется "фильтрация" и выполняется она в PHP с помощью функции array_filter
(в других языках её называют просто filter
или select
). Понятие "фильтрация" интуитивно понятно каждому человеку. Мы пьём фильтрованную воду и фильтруем то, что говорим. В программировании практически то же самое. Операция "фильтрация" по отношению к коллекции означает, что мы отбираем из неё только те элементы, которые удовлетворяют условию. Возьмём наших многострадальных пользователей. Типичная задача может выглядеть так, выберем пользователей старше 10 лет.
<?php
$users = [
['name' => 'Igor', 'age' => 19],
['name' => 'Danil', 'age' => 1],
['name' => 'Vovan', 'age' => 4],
['name' => 'Matvey', 'age' => 16],
];
$result = [];
foreach ($users as $user) {
if ($user['age'] > 10) {
$result[] = $user;
}
}
print_r($result);
// => Array
// (
// [0] => Array
// (
// [name] => Igor
// [age] => 19
// )
//
// [1] => Array
// (
// [name] => Matvey
// [age] => 16
// )
//
// )
Фильтрация встречается так же часто как отображение, а возможно и чаще. Общая схема кода при фильтрации практически один в один как и в отображении, кроме пары ключевых моментов:
Теперь посмотрим, как выглядит фильтрация при использовании функции высшего порядка array_filter
.
<?php
// Порядок аргументов обратный. Сначала коллекция, затем функция.
// $user – элемент массива $users
$filteredUsers = array_filter($users, fn($user) => $user['age'] > 10);
В отличие от array_map
, функция, которая передаётся в array_filter
должна быть предикатом. То есть её задача вернуть либо true
либо false
для каждого элемента коллекции. Значение, которое возвращается никак не используется, оно всего лишь говорит о том, включать ли текущий элемент в итоговый массив либо нет. Новички часто делают ошибку на этом этапе и начинают возвращать из фильтра то, что они бы хотели увидеть в результирующем массиве (для этого надо применять array_map
).
<?php
function myFilter($coll, callable $callback)
{
$result = [];
foreach ($coll as $key => $item) {
// Предикат используется только для проверки
// Внутрь $callback по очереди передается каждый элемент коллекции $coll
if ($callback($item)) {
// В результат всегда добавляется элемент исходной коллекции
$result[$key] = $item;
}
}
return $result;
}
Обратите внимание на то, что array_filter
сохраняет ключи. При работе с индексированными массивами такое поведение нежелательно, поэтому придётся использовать функцию array_values
для сброса порядка.
Вам ответят команда поддержки Хекслета или другие студенты.
Базовый план откроет полный доступ ко всем курсам, упражнениям и урокам Хекслета, проектам и пожизненный доступ к теории пройденных уроков. Подписку можно отменить в любой момент.
Курсы программирования для новичков и опытных разработчиков. Начните обучение бесплатно
Наши выпускники работают в компаниях:
С нуля до разработчика. Возвращаем деньги, если не удалось найти работу.
Зарегистрируйтесь или войдите в свой аккаунт