PHP array_filter() — это встроенная функция PHP, которая фильтрует элементы массива с помощью встроенной функции PHP или пользовательской функции обратного вызова.

array_filter(array, callback, flag);

Функция array_filter() передает каждое значение входного массива в функцию обратного вызова. Если функция callback возвращает true, текущее значение из array возвращается в массив результатов, в противном случае нет. Функция обратного вызова должна возвращать значение true или false.

Ключи массива сохраняются и могут привести к пробелам, если array был проиндексирован.

arrayRequiredУказывает массив для фильтрацииcallbackOptionalФункция обратного вызова. Это может быть встроенная функция PHP или пользовательская. Если callback не указано, все пустые элементы массива будут удалены.
Начиная с PHP 8.0.0 эта функция может иметь значение null.flagOptionalУказывает, какие аргументы отправляются в обратный вызов:
ARRAY_FILTER_USE_KEY — передает ключ в качестве единственного аргумента в callback вместо значения
ARRAY_FILTER_USE_BOTH — передает и значение, и ключ в качестве аргументов в callback вместо значения
Значение по умолчанию — 0, которое передает значение в качестве единственного аргумента вместо этого на callback. Возвращаемое значение Возвращает отфильтрованный массив.

Эта функция доступна в PHP, начиная с версии 4.0.6.

Пример встроенной функции PHP:

$cars = array(1 => 'Ferrari', 2 => 2, 3 => 'BMW');
var_dump(array_filter($cars, 'is_string'));

Выход

array (size=2)
  1 => string 'Ferrari' (length=7)
  3 => string 'BMW' (length=3)

В этом примере проверяется, является ли элемент строкой или нет.

Пример пользовательской функции:

$cars = array(1 => 'Ferrari', 2 => 2, 3 => 'BMW');
function findString($value)
{
    return is_string($value);
}
var_dump(array_filter($cars, 'findString'));

Выход

array (size=2)
  1 => string 'Ferrari' (length=7)
  3 => string 'BMW' (length=3)

ARRAY_FILTER_USE_KEY

В PHP 5.6 появился третий параметр array_filter(), называемый flag, который можно установить в ARRAY_FILTER_USE_KEY для фильтрации по ключу, а не по значению.

ARRAY_FILTER_USE_BOTH

Вы можете установить его в ARRAY_FILTER_USE_BOTH для фильтрации по ключу или значению.

Как отфильтровать массив по ключу и значению с помощью PHP array_filter()

Чтобы отфильтровать массив по его ключам или значениям, вы можете использовать опцию «флаг», как в следующем коде.

Фильтр по ключу:

$cars = array(1 => 'Ferrari', 2 => 'Benz', 3 => 'BMW', 4 => 'Volvo');
var_dump(array_filter($cars, function ($key) {
    return $key == 2;
}, ARRAY_FILTER_USE_KEY));

Выход

array (size=1)
  2 => string 'Benz' (length=4)

Фильтровать по ключу и значению

$cars = array(1 => 'Ferrari', 2 => 'Benz', 3 => 'BMW', 4 => 'Volvo');
var_dump(array_filter($cars, function ($value, $key) {
    return $key == 4 || $value == 'Ferrari';
}, ARRAY_FILTER_USE_BOTH));

Выход

array (size=2)
  1 => string 'Ferrari' (length=7)
  4 => string 'Volvo' (length=5)

Фильтрация многомерного массива в PHP

$cars = array(
    array('name' => 'Ferrari', 'rate' => 5),
    array('name' => 'Benz', 'rate' => 5),
    array('name' => 'BMW', 'rate' => 4),
    array('name' => 'Volvo', 'rate' => 4)
);
var_dump(array_filter($cars, function ($car) {
    return $car['rate'] == 5;
}));

Выход

array (size=2)
  0 => 
    array (size=2)
      'name' => string 'Ferrari' (length=7)
      'rate' => int 5
  1 => 
    array (size=2)
      'name' => string 'Benz' (length=4)
      'rate' => int 5

Удалить пустые и нулевые значения из массива

Вы можете использовать функцию PHP array_filter() для удаления пустых или нулевых значений массива. Для этого игнорируйте часть функции обратного вызова.

$cars = array(1 => 'Ferrari', 2 => '', 3 => 'BMW', 4 => null);
var_dump(array_filter($cars));

Выход:

array (size=2)
  1 => string 'Ferrari' (length=7)
  3 => string 'BMW' (length=3)

Вы можете удалить любое значение из массива, который представляет пустые, нулевые или нулевые значения.

$entry = array(
    0 => 'foo',
    1 => false,
    2 => -1,
    3 => null,
    4 => '',
    5 => '0',
    6 => 0,
);
var_dump(array_filter($entry));

Выход

array (size=2)
  0 => string 'foo' (length=3)
  2 => int -1

Массив фильтров без функции array_filter() в PHP

Если вы не хотите использовать функцию array_filter(), у вас есть альтернативы этой функции. Вместо этого вы можете использовать for или foreach цикл или любой другой цикл.

$cars = array(1 => 'Ferrari', 2 => 'Benz', 3 => 'BMW', 4 => 'Volvo');
$filtered_cars = [];
foreach ($cars as $key => $value) {
    if ($key == 2) {
        $filtered_cars[$key] = $value;
    }
}
var_dump($filtered_cars);

Выход:

array (size=1)
  2 => string 'Benz' (length=4)

Этот пример обращается к каждому элементу и проверяет, равен ли его ключ 2 или нет. Если ключ элемента равен 2, значение будет добавлено в массив filtered_cars. В основном это похоже на поиск в массиве или итерацию массива.

Подробнее:Добавить элемент в массив PHP

Как видите, вам нужно приложить больше усилий и кода для фильтрации массива в этом методе.

Использование обратного вызова PHP array_filter в качестве метода класса

Вы можете передать метод класса в функцию array_filter(). Метод должен возвращать значение true или false.

array_filter($array, [$instance, 'callback']);
$cars = array(1 => 'Ferrari', 2 => 'Benz', 3 => 'BMW', 4 => 'Volvo');
class Obj
{
    public function isFerrari($value)
    {
        return $value === 'Ferrari';
    }
}
var_dump(array_filter($cars, array(new Obj, 'isFerrari')));

Выход:

array (size=1)
  1 => string 'Ferrari' (length=7)

Если у вас есть класс со статическим методом, вы передаете статический метод в качестве обратного вызова функции array_filter(), вы можете использовать приведенный ниже синтаксис.

array_filter($array, ['className', 'callback']);

Например:

$cars = array(1 => 'Ferrari', 2 => 'Benz', 3 => 'BMW', 4 => 'Volvo');
class Obj
{
    public static function isFerrari($value)
    {
        return $value === 'Ferrari';
    }
}
var_dump(array_filter($cars, array('Obj', 'isFerrari')));

Выход

array (size=1)
  1 => string 'Ferrari' (length=7)

Более