Array filter: примеры (PHP)
array_filter(array $array, callable|null $callback = null, int $mode = 0): arrayФункция array_filter в PHP
Функция array_filter() применяется для фильтрации элементов массива с использованием callback-функции или без неё. Она полезна, когда требуется отобрать элементы по определённому критерию, например, удалить пустые, ложные значения или выбрать объекты с конкретными свойствами.
array $array - обязательный. Исходный массив для фильтрации.
callable|null $callback = null - необязательный. Callback-функция, которая принимает значение элемента массива и должна возвращать true для его сохранения в результате или false для отбрасывания. Если параметр не передан, функция удалит все элементы, равные false (согласно приведению к булевому типу).
int $mode = 0 - необязательный. Флаг, определяющий, какие аргументы передавать в callback-функцию.
ARRAY_FILTER_USE_KEY (1) - передавать только ключ элемента.
ARRAY_FILTER_USE_BOTH (2) - передавать и значение, и ключ.
Примеры использования array_filter
Удаление ложных значений.
<?php
$array = [0, 1, false, 2, '', 3, null];
$result = array_filter($array);
print_r($result);
?>Array
(
[1] => 1
[3] => 2
[5] => 3
)Фильтрация чётных чисел.
<?php
$numbers = [1, 2, 3, 4, 5];
$even = array_filter($numbers, fn($value) => $value % 2 === 0);
print_r($even);
?>Array
(
[1] => 2
[3] => 4
)Фильтрация по строковым ключам.
<?php
$data = ['a' => 1, 0 => 2, 'b' => 3, 1 => 4];
$result = array_filter($data, fn($key) => is_string($key), ARRAY_FILTER_USE_KEY);
print_r($result);
?>Array
(
[a] => 1
[b] => 3
)Фильтрация, использующая и ключ, и значение.
<?php
$inventory = ['apple' => 5, 'banana' => 0, 'orange' => 10];
$inStock = array_filter($inventory, fn($val, $key) => $val > 0 && $key !== 'banana', ARRAY_FILTER_USE_BOTH);
print_r($inStock);
?>Array
(
[apple] => 5
[orange] => 10
)Похожие функции в PHP
Применяет callback-функцию ко всем элементам массива и возвращает новый массив результатов. Используется для преобразования данных, а не для фильтрации. array_filter выбирает элементы, array_map изменяет их.
Итеративно сводит массив к одному значению с помощью callback-функции. Подходит для агрегации данных (сумма, конкатенация).
Традиционные циклы предоставляют полный контроль над процессом итерации и фильтрации, но требуют больше кода. array_filter предлагает декларативный и лаконичный подход для простых условий фильтрации.
array_filter - для выборки элементов по условию. array_map - для изменения всех элементов. array_reduce - для получения одного значения из массива. Циклы - для сложной логики, где нужен полный контроль или побочные эффекты.
Типичные ошибки
Функция сохраняет исходные ключи, что иногда приводит к "дырявым" массивам. Если нужна последовательная нумерация, можно применить array_values().
<?php
$arr = [10, 0, 20];
$filtered = array_filter($arr);
print_r($filtered);
$reindexed = array_values($filtered);
print_r($reindexed);
?>Array
(
[0] => 10
[2] => 20
)
Array
(
[0] => 10
[1] => 20
)Использование флага без передачи соответствующего количества аргументов в callback приводит к ошибке.
<?php
// ОШИБКА: Ожидается 2 аргумента, получен 1
$arr = ['a'=>1, 'b'=>2];
$res = array_filter($arr, fn($val) => $val > 1, ARRAY_FILTER_USE_BOTH);
?>Callback должен возвращать true/false. Любое другое значение будет неявно преобразовано, что может привести к неожиданным результатам.
<?php
$arr = [0, 1, 2, 3];
// Возвращает 2, что приводится к true
$result = array_filter($arr, fn($v) => $v * 2);
print_r($result);
?>Array
(
[1] => 1
[2] => 2
[3] => 3
)Изменения в новых версиях PHP
Параметр $callback теперь может принимать значение null по умолчанию. Если передать null, функция будет вести себя так, как если бы callback не был передан, удаляя ложные значения. Ранее это могло привести к ошибке, если передавалась переменная, которая могла быть null.
В PHP 8 была улучшена внутренняя обработка итераторов и массивов, что может положительно сказаться на производительности array filter при работе с большими наборами данных, хотя её асимптотическая сложность O(n) осталась прежней.
Расширенные примеры
Отбор объектов по значению свойства.
<?php
class Product {
public function __construct(public string $name, public float $price) {}
}
$products = [
new Product('Apple', 1.5),
new Product('Banana', 0.8),
new Product('Cherry', 2.3)
];
$expensive = array_filter($products, fn($p) => $p->price > 1.0);
print_r($expensive);
?>Использование оператора use для передачи внешней переменной в замыкание.
<?php
$minPrice = 1.0;
$prices = ['a' => 0.5, 'b' => 1.2, 'c' => 0.9];
$filtered = array_filter($prices, fn($price) => $price >= $minPrice);
print_r($filtered);
?>Array
(
[b] => 1.2
)Выбор элементов внутреннего массива по условию.
<?php
$users = [
['id' => 1, 'active' => true],
['id' => 2, 'active' => false],
['id' => 3, 'active' => true]
];
$activeUsers = array_filter($users, fn($user) => $user['active']);
print_r($activeUsers);
?>Фильтрация, а затем преобразование отфильтрованных данных.
<?php
$numbers = [1, 2, 3, 4];
// Оставить чётные и возвести в квадрат
$squaredEvens = array_map(
fn($v) => $v ** 2,
array_filter($numbers, fn($n) => $n % 2 === 0)
);
print_r($squaredEvens);
?>Array
(
[1] => 4
[3] => 16
)Использование логического отрицания для инвертирования условия.
<?php
$arr = [0, 1, 'a', '', null, false];
// Оставить только действительно пустые/ложные значения
$falsyOnly = array_filter($arr, fn($v) => !$v);
print_r($falsyOnly);
?>Array
(
[0] => 0
[3] =>
[4] =>
[5] =>
)Аналоги в других языках
Функция filter() или генераторы списков. filter возвращает итератор.
numbers = [1, 2, 3, 4, 5]
even = list(filter(lambda x: x % 2 == 0, numbers))
print(even)[2, 4]
Array filter в Javascript
Метод массива Array.prototype.filter(). Синтаксис похож на PHP.
const numbers = [1, 2, 3, 4, 5];
const even = numbers.filter(value => value % 2 === 0);
console.log(even);[2, 4]
Array filter в MySQL
В контексте СУБД фильтрация выполняется предложением WHERE в SQL-запросе.
SELECT * FROM products WHERE quantity > 0;В Python и JavaScript методы часто являются частью объекта массива и поддерживают цепочки вызовов. В PHP array_filter - глобальная функция. Логика фильтрации в декларативных языках (SQL) описывается на языке запросов, а не в императивном коде.