W3docs

Функция 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

Наиболее распространённый способ использования — фильтрация по пользовательскому условию. Здесь мы оставляем только чётные числа:

php— editable, runs on the server

Вывод:

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 оставляет только числовые значения:

php— editable, runs on the server

Вывод:

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.

Практика

Практика
Что делает функция array_filter() в PHP?
Что делает функция array_filter() в PHP?
Was this page helpful?