> Какой порядок параметров у функции 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_KEY callback получает строковый ключ, а не индекс
  • Для ассоциативных массивов с числовыми строками-ключами 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

> ГОТОВЫ К СЛЕДУЮЩЕМУ СОБЕСЕДОВАНИЮ?

Запустите тренировочную сессию с ИИ и получите детальную обратную связь, чтобы увереннее проходить реальные интервью