Array filter: примеры (PHP)

Фильтрация массивов: работа с функцией array_filter
Раздел: Работа с массивами
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

Без callback-функции

Удаление ложных значений.

<?php
$array = [0, 1, false, 2, '', 3, null];
$result = array_filter($array);
print_r($result);
?>
Array
(
    [1] => 1
    [3] => 2
    [5] => 3
)
С callback-функцией и использованием значения

Фильтрация чётных чисел.

<?php
$numbers = [1, 2, 3, 4, 5];
$even = array_filter($numbers, fn($value) => $value % 2 === 0);
print_r($even);
?>
Array
(
    [1] => 2
    [3] => 4
)
С флагом ARRAY_FILTER_USE_KEY

Фильтрация по строковым ключам.

<?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
)
С флагом ARRAY_FILTER_USE_BOTH

Фильтрация, использующая и ключ, и значение.

<?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-функции. Подходит для агрегации данных (сумма, конкатенация).

Циклы foreach

Традиционные циклы предоставляют полный контроль над процессом итерации и фильтрации, но требуют больше кода. 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, возвращающий не булево значение

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

PHP 8.0

Параметр $callback теперь может принимать значение null по умолчанию. Если передать null, функция будет вести себя так, как если бы callback не был передан, удаляя ложные значения. Ранее это могло привести к ошибке, если передавалась переменная, которая могла быть null.

Общие улучшения

В PHP 8 была улучшена внутренняя обработка итераторов и массивов, что может положительно сказаться на производительности array filter при работе с большими наборами данных, хотя её асимптотическая сложность O(n) осталась прежней.

Расширенные примеры

Фильтрация объектов

Отбор объектов по значению свойства.

Пример php
<?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
<?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
<?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);
?>
Комбинирование с array_map

Фильтрация, а затем преобразование отфильтрованных данных.

Пример php
<?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
<?php
$arr = [0, 1, 'a', '', null, false];
// Оставить только действительно пустые/ложные значения
$falsyOnly = array_filter($arr, fn($v) => !$v);
print_r($falsyOnly);
?>
Array
(
    [0] => 0
    [3] => 
    [4] => 
    [5] => 
)

Аналоги в других языках

Python

Функция 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) описывается на языке запросов, а не в императивном коде.

PHP array_filter function comments

En
Array filter Filters elements of an array using a callback function