Menu

PHP array_filter(): фильтрация массива по значению и ключу

array_filter($array, $callback) оставляет элементы, для которых колбэк возвращает true. Как удалить пустые значения, фильтровать по ключу через ARRAY_FILTER_USE_KEY, перенумеровать результат через array_values и подвести итог через array_reduce.

На этой странице есть исполняемые редакторы: меняйте, запускайте и сразу видите результат.

array_filter($array, $callback) возвращает элементы $array, для которых $callback возвращает true (или любое значение, приводимое к true). Сначала идёт массив, потом колбэк, а оставшиеся элементы сохраняют исходные ключи.

Ключи в результате 1, 3, 5, 7: позиции, которые эти значения занимали в исходном массиве. Эта деталь важнее, чем кажется, и через раздел показано, что с ней делать.

Удаление пустых значений из массива

Вызовите array_filter без колбэка, и она удалит все значения, которые приводятся к false: пустые строки, null, false, 0, "0" и пустые массивы. Это самый быстрый способ почистить результат explode() или список полей формы.

Первый результат потерял ещё и "0" и 0, а это часто настоящие данные (нулевое количество, цифра индекса). Когда ноль допустимый ответ, пишите колбэк сами, как во втором вызове. Полный список значений, которые PHP считает пустыми, есть на странице про empty.

Перенумерация результата через array_values

Поскольку ключи сохраняются, в отфильтрованном списке могут быть пропуски. Цикл for от 0 тогда натыкается на отсутствующие ключи, а json_encode превращает результат в JSON-объект, а не в массив. array_values() перенумеровывает его.

Фильтр по ключу через ARRAY_FILTER_USE_KEY

Третий аргумент выбирает, что получает колбэк. ARRAY_FILTER_USE_KEY передаёт только ключ. ARRAY_FILTER_USE_BOTH передаёт значение, а потом ключ.

Чтобы оставить заранее известный набор ключей, array_intersect_key($config, array_flip(['db_host', 'db_port'])) делает то же без колбэка.

Фильтрация многомерного массива

Большинство реальных данных это список строк. Колбэк получает по одной строке, поэтому вы проверяете нужное поле.

Измените $maxPrice и запустите снова. Чтобы потом получить только названия, передайте результат в array_column: array_column($affordable, 'name').

Отфильтровать, преобразовать, свернуть

array_filter выбирает элементы, array_map их меняет, а array_reduce сворачивает массив в одно значение. array_reduce($array, $callback, $initial) вызывает колбэк с текущим итогом и следующим элементом.

Для простой суммы короче array_sum($totals). array_reduce оправдывает себя, когда результат другой: строка, количество по группам, самая большая строка.

Частая ошибка: изменение значений внутри array_filter

Возвращаемое значение колбэка решает только то, остаётся ли элемент. Всё остальное, что он вычисляет, выбрасывается, поэтому этот код ничего не обрезает:

Преобразуйте через array_map, потом фильтруйте и добавьте array_values, когда нужен чистый список.

Часто задаваемые вопросы

Как удалить пустые значения из массива в PHP?

Вызовите array_filter($array) без колбэка: она отбросит все ложные значения ("", null, false, 0, "0", []). Чтобы убрать только пустые строки и null, но оставить 0, передайте колбэк: array_filter($array, fn($v) => $v !== '' && $v !== null).

Почему array_filter сохраняет старые ключи?

array_filter никогда не перенумеровывает: оставленные элементы остаются под исходными ключами, поэтому список может вернуться как [0 => 'a', 2 => 'c']. Оберните результат в array_values(), чтобы снова получить 0, 1, 2; тогда и json_encode выдаст JSON-массив, а не объект.

Как отфильтровать массив по ключу в PHP?

Передайте ARRAY_FILTER_USE_KEY третьим аргументом, и колбэк получит ключ вместо значения: array_filter($arr, fn($k) => str_starts_with($k, 'db_'), ARRAY_FILTER_USE_KEY). Используйте ARRAY_FILTER_USE_BOTH, чтобы получать и значение, и ключ.

Чем array_filter отличается от array_map?

array_filter решает, какие элементы остаются, и возвращает их без изменений. array_map меняет каждый элемент и возвращает столько же элементов. Чтобы сделать и то, и другое, соедините их: array_map('strtoupper', array_filter($arr)).

Иллюстрация языков программирования Coddy

Учитесь программировать с Coddy

НАЧАТЬ