> Какой порядок параметров у функции array_filter в PHP (PHP)
Уровень: senior · Роль: backend · Язык: PHP · Категория: Технические вопросы
Компании: витринатв
Стек: PHP
> Пример ответа
Короткий ответ
Сигнатура функции: array_filter(array $array, ?callable $callback = null, int $mode = 0): array. Первый параметр - массив, второй - callback-функция (необязательный), третий - флаг режима передачи значений в callback (ARRAY_FILTER_USE_KEY или ARRAY_FILTER_USE_BOTH). Если callback не передан, удаляются все элементы, эквивалентные false. Функция возвращает отфильтрованный массив, сохраняя исходные ключи.
Подробное объяснение
Порядок параметров исторически сложился так: сначала данные, потом логика обработки. Это соответствует общей конвенции PHP для функций массива (например, array_map, array_walk), где массив идёт первым.
Третий параметр $mode появился в PHP 5.6 и управляет тем, что передаётся в callback:
0(по умолчанию) - только значение элементаARRAY_FILTER_USE_KEY- только ключ элементаARRAY_FILTER_USE_BOTH- и ключ, и значение (в этом порядке: значение, ключ)
Важный нюанс: callback получает значение первым аргументом, а ключ вторым - даже при ARRAY_FILTER_USE_BOTH. Это неочевидно, потому что в array_map порядок обратный (ключи не передаются вовсе, но в array_walk - сначала значение, потом ключ).
Функция не переиндексирует массив - ключи сохраняются. Если нужна переиндексация, применяют array_values().
На практике
Для senior-позиции важно не просто назвать порядок, а продемонстрировать понимание edge cases:
- При
ARRAY_FILTER_USE_KEYcallback получает строковый ключ, а не индекс - Для ассоциативных массивов с числовыми строками-ключами PHP автоматически приводит их к int
- Если callback возвращает не-bool, результат приводится к bool по стандартным правилам
- Пустой массив всегда возвращает пустой массив, callback не вызывается ни разу
Часто на практике используют стрелочные функции: array_filter($arr, fn($v) => $v > 0). Для фильтрации по ключам - array_filter($arr, fn($k) => $k !== 'skip', ARRAY_FILTER_USE_KEY).
Пример кода
PHP$data = ['a' => 1, 'b' => 0, 'c' => 3, 'd' => -2];// Без callback - удаляем falsy значения$filtered = array_filter($data); // ['a' => 1, 'c' => 3]// Фильтр по значению$positive = array_filter($data, fn($v) => $v > 0); // ['a' => 1, 'c' => 3]// Фильтр по ключу$byKey = array_filter($data, fn($k) => $k !== 'b', ARRAY_FILTER_USE_KEY);// ['a' => 1, 'c' => 3, 'd' => -2]// Фильтр по ключу и значению$both = array_filter($data, fn($v, $k) => $v > 0 && $k !== 'd', ARRAY_FILTER_USE_BOTH);// ['a' => 1, 'c' => 3]// Сохранение ключей - важное отличие от array_values$result = array_filter([1, 0, 2]); // [0 => 1, 2 => 2]
Как отвечать на собеседовании
Начните с точной сигнатуры, затем поясните назначение каждого параметра. Упомяните, что callback необязателен, и что происходит без него. Покажите понимание третьего параметра и его констант. Добавьте про сохранение ключей - это частый источник багов. Если спросят про отличия от array_map - отметьте, что array_filter сохраняет ключи, а array_map переиндексирует, и что порядок аргументов в callback у array_filter - значение, потом ключ.
Что проверяет интервьюер
- Точное знание сигнатуры без обращения к документации
- Понимание необязательности callback и поведения по умолчанию
- Осведомлённость о флагах режима и их семантике
- Знание особенности сохранения ключей
- Умение применить на практике с современным синтаксисом (стрелочные функции)
Типичные ошибки
- Путаница порядка аргументов в callback при
ARRAY_FILTER_USE_BOTH- сначала значение, потом ключ - Забывают, что ключи сохраняются, и ожидают переиндексацию
- Передают callback вторым аргументом, но путают местами массив и callback
- Используют
ARRAY_FILTER_USE_KEYбез понимания, что ключ передаётся как строка для ассоциативных массивов - Не учитывают приведение типов результата callback к bool
- Пытаются использовать
array_filterдля переиндексации безarray_values
> Похожие задачи по PHP
Какой паттерн реализует Doctrine ORM
Почему перешли с расширения mysql на PDO в PHP
Что произойдет при вызове асинхронной функции без await?
Как устроен жизненный цикл запроса в Symfony
> Похожие задачи по backend
Какой паттерн реализует Doctrine ORM
Почему перешли с расширения mysql на PDO в PHP
Что произойдет при вызове асинхронной функции без await?
Как устроен жизненный цикл запроса в Symfony
> ГОТОВЫ К СЛЕДУЮЩЕМУ СОБЕСЕДОВАНИЮ?
Запустите тренировочную сессию с ИИ и получите детальную обратную связь, чтобы увереннее проходить реальные интервью