Функция array_filter() в PHP: полное руководство
Функция array_filter() в PHP фильтрует элементы массива по заданному условию и возвращает новый массив с прошедшими проверку элементами.
array_filter() — встроенная функция PHP, которая возвращает новый array, содержащий только те элементы исходного массива, которые прошли заданную вами проверку. Вы передаёте ей callback — функцию, возвращающую true, чтобы сохранить элемент, и false, чтобы его отбросить — и array_filter() вызывает её для каждого элемента.
На этой странице описано, как работает функция, все три её режима (фильтрация по значению, по ключу или по обоим), подводный камень, с которым сталкиваются большинство новичков (сохранение ключей), а также краткая форма для удаления «пустых» значений.
Как работает array_filter()
array_filter() обходит массив поэлементно и вызывает ваш callback для каждого из них:
- Если callback возвращает истинное значение, элемент сохраняется.
- Если он возвращает ложное значение, элемент отбрасывается.
Исходный массив никогда не изменяется — array_filter() создаёт и возвращает новый массив. По умолчанию callback получает значение элемента (а не его ключ).
Синтаксис
array_filter(array $array, ?callable $callback = null, int $mode = 0): array$array— массив для фильтрации.$callback— функция проверки. Необязательна: если не указана, удаляются все элементы, равные ложному значению (false,0,0.0,"","0",null,[]).$mode— управляет тем, что получает callback. Одно из значений:0(по умолчанию, значение),ARRAY_FILTER_USE_KEYилиARRAY_FILTER_USE_BOTH. См. Фильтрация по ключу.
Фильтрация с пользовательским callback
Наиболее распространённый способ использования — фильтрация по пользовательскому условию. Здесь мы оставляем только чётные числа:
Вывод:
Array ( [1] => 2 [3] => 4 [5] => 6 )Обратите внимание на ключи: сохранённые элементы сохраняют свои исходные ключи (1, 3, 5) и не перенумеруются. Это главный сюрприз array_filter(). Как это исправить — см. Переиндексация результата ниже.
В современном PHP callback можно записать в виде лаконичной стрелочной функции:
$evenNumbers = array_filter($numbers, fn ($number) => $number % 2 === 0);Использование встроенной функции в качестве callback
Callback может быть любым вызываемым объектом, включая встроенную функцию, переданную по имени. Здесь is_numeric оставляет только числовые значения:
Вывод:
Array ( [0] => 1 [1] => 2 [3] => 4 [4] => 5 )Строка '2' сохраняется, потому что is_numeric('2') равно true, тогда как 'three' отбрасывается.
Удаление пустых значений (без callback)
Вызовите array_filter() только с массивом, чтобы удалить все ложные элементы — быстрый способ очистить список необязательных входных данных:
<?php
$values = [0, 1, 2, '', '0', 'hello', null, false, []];
print_r(array_filter($values));
?>Вывод:
Array ( [1] => 1 [2] => 2 [5] => hello )Будьте осторожны: при этом удаляются 0, '0' и '', поскольку они являются ложными значениями. Если литерал 0 или '0' имеет смысл в ваших данных, передайте явный callback, например fn ($v) => $v !== null.
Фильтрация по ключу или по обоим параметрам
По умолчанию callback видит только значение. Передайте аргумент $mode, чтобы изменить это поведение:
ARRAY_FILTER_USE_KEY передаёт в callback ключ вместо значения:
<?php
$data = ['a' => 1, 'b' => 2, 'ab' => 3];
// Keep only single-letter keys
$result = array_filter($data, fn ($key) => strlen($key) === 1, ARRAY_FILTER_USE_KEY);
print_r($result);
?>Вывод:
Array ( [a] => 1 [b] => 2 )ARRAY_FILTER_USE_BOTH передаёт в callback и значение, и ключ (значение первым):
<?php
$data = ['a' => 1, 'b' => 2, 'c' => 3];
$result = array_filter($data, fn ($value, $key) => $value > 1 && $key !== 'c', ARRAY_FILTER_USE_BOTH);
print_r($result);
?>Вывод:
Array ( [b] => 2 )Переиндексация результата
Поскольку array_filter() сохраняет ключи, индексированный массив может оказаться с пробелами ([1], [3], [5]). Когда нужен чистый список с нулевой базой — например, перед JSON-кодированием в виде JSON-массива — оберните результат в array_values():
<?php
$numbers = [1, 2, 3, 4, 5, 6];
$even = array_values(array_filter($numbers, fn ($n) => $n % 2 === 0));
print_r($even);
?>Вывод:
Array ( [0] => 2 [1] => 4 [2] => 6 )Когда использовать array_filter()
- Используйте
array_filter(), когда нужно получить подмножество массива (отбросить ненужные элементы). - Используйте
array_map(), когда нужно преобразовать каждый элемент, сохранив их количество. - Используйте
array_reduce(), когда нужно свернуть массив в одно значение.
filter, map и reduce хорошо сочетаются между собой — сначала фильтруйте, затем применяйте map к выжившим элементам.
Заключение
array_filter() — идиоматический способ извлечь подмножество массива в PHP. Помните о двух ключевых особенностях: исходный массив остаётся нетронутым, а выжившие элементы сохраняют свои исходные ключи (используйте array_values() для переиндексации). Благодаря необязательному callback и режимам ARRAY_FILTER_USE_KEY / ARRAY_FILTER_USE_BOTH функция позволяет фильтровать по значению, ключу или обоим параметрам. Подробнее о работе с массивами — в обзоре PHP Arrays.