Какой порядок параметров у функции array_filter в PHP
Что проверяют
Знание стандартной библиотеки без подсказок IDE и её известной непоследовательности. Вопрос почти всегда продолжается сравнением с array_map, а потом уточнением, что происходит с ключами.
Как отвечать
Сигнатура в PHP 8: array_filter(array $array, ?callable $callback = null, int $mode = 0): array. Сначала массив, потом колбэк, потом режим. Сразу покажите, где подвох:
array_mapнаоборот:array_map(?callable $callback, array $array, array ...$arrays), колбэк первым, потому что массивов может быть несколько. Разнобой исторический и стоит в одном ряду сin_array($needle, $haystack)противstrpos($haystack, $needle);- режим: по умолчанию в колбэк идёт только значение.
ARRAY_FILTER_USE_KEYпередаёт только ключ,ARRAY_FILTER_USE_BOTHпередаёт значение и ключ, именно в таком порядке; - без колбэка: удаляются все элементы, которые приводятся к
false:false,null,0,0.0,'','0'и пустой массив; - ключи сохраняются: результат не переиндексируется, для списка нужен
array_values(array_filter(...)).
С PHP 8.0 порядок можно не запоминать и передать именованные аргументы: array_filter($users, mode: ARRAY_FILTER_USE_KEY, callback: fn($k) => $k !== 'admin'). Стрелочная функция fn захватывает внешние переменные по значению без use, для колбэков это самый короткий вариант.
Если спросят про память: array_filter возвращает новый массив и не меняет исходный. Для больших наборов, которые не нужно держать целиком, лучше генератор с yield.
Где спотыкаются
Забывают про сохранение ключей. После фильтрации $result[0] может не существовать, а json_encode превращает массив с дырками в объект, и фронтенд получает {"1": ..., "3": ...} вместо списка.
Не помнят, что строка '0' считается ложной. Фильтр без колбэка выкидывает её вместе с пустыми значениями, и из данных формы пропадают валидные нули.
Путают порядок аргументов в режиме ARRAY_FILTER_USE_BOTH и пишут function ($key, $value). Ошибки не будет, просто фильтр начнёт проверять не то.