Функция array_filter()

Тренажер по PHP для пользователей с начальным уровнем подготовки.

Тренажер PHP

Функция `array_filter()` — мощный инструмент в арсенале PHP-разработчика для работы с массивами. Она позволяет элегантно "просеивать" массив, оставляя в нем только те элементы, которые удовлетворяют заданному условию. Это избавляет от необходимости писать циклы `foreach` с вложенными `if`, делая код более читаемым и лаконичным.

В этом уроке мы изучим `array_filter()` от А до Я. Начнем с простейшего использования для удаления "пустых" значений, затем перейдем к фильтрации с помощью callback-функций, разберем работу с анонимными функциями и специальными флагами для фильтрации по ключам. Вас ждут задания на написание кода, поиск ошибок и предсказание результата, которые помогут закрепить теорию на практике.

Список тем

Простейшая фильтрация: удаление "пустых" значений

id: 38977_task1

Самое базовое использование `array_filter()` — вызов без второго аргумента (callback-функции). В этом режиме она удаляет все элементы, которые приводятся к `false`. Заполните пропуски, чтобы отфильтровать массив `$data` от таких значений.

Заполните пропуски
<?php
$data = [1, 'hello', 0, '', false, 'world', null, '0'];

// Удаляем все значения, которые эквивалентны false
$filtered_data = input1S(input2S);

print_r($filtered_data);
?>
Сообщения
Проверить
Показать решение на 3 сек.
Показать подсказку

Фильтрация с помощью callback-функции

id: 38977_task2

Теперь добавим условие. У нас есть массив чисел, и нужно оставить только те, что больше 10. Для этого в `array_filter` передается вторым аргументом callback-функция, которая должна возвращать `true` для подходящих элементов. Заполните пропуски для создания такой фильтрации.

Заполните пропуски
<?php
$numbers = [5, 12, 8, 25, 10, 15];

$large_numbers = array_filter($numbers, function($number) {
    return $number input1S 10;
});

print_r($large_numbers);
?>
Сообщения
Проверить
Показать решение на 3 сек.
Показать подсказку

Что останется в массиве?

id: 38977_task3

В этом коде используется короткая стрелочная функция для фильтрации массива строк. Фильтр должен оставить только те строки, которые содержат подстроку 'pro'. Внимательно проанализируйте код и выберите, какой результат будет выведен на экран.

Выберите правильный вариант ответа
<?php
$items = ['processor', 'ram', 'monitor', 'projector'];

$pro_items = array_filter(
    $items,
    fn($item) => str_contains($item, 'pro')
);

print_r($pro_items);
?>
Сообщения
Проверить
Показать подсказку

Найдите и исправьте ошибку в callback-функции

id: 38977_task4

Программист хотел отфильтровать массив, оставив только непустые строки. Однако он допустил ошибку в условии внутри callback-функции, из-за чего результат получился неверным. Найдите и исправьте ошибочную строку.

Найдите ошибку и исправьте
<?php
$strings = ["first", "", "third", ""];
 
$non_empty = array_filter($strings, function($value) {
    return $value = '';
});
 
print_r($non_empty);
?>
Сообщения
Проверить
Показать решение на 3 сек.
Показать подсказку

Соберите скрипт для фильтрации активных пользователей

id: 38977_task5

Из перемешанных строк кода соберите рабочий PHP-скрипт. Он должен объявить массив пользователей (каждый — ассоциативный массив), а затем отфильтровать его, оставив только тех, у кого ключ 'isActive' имеет значение `true`.

Перетяните в правильном порядке строки из одного блока в другой
$users = [['name' => 'John', 'isActive' => true], ['name' => 'Pete', 'isActive' => false]];
<?php
print_r($active_users);
$active_users = array_filter($users, fn($user) => $user['isActive']);
?>
$inactive_users = array_filter($users, fn($user) => !$user['isActive']);
echo "Done";
Сообщения
Проверить
Показать решение на 3 сек.
Показать подсказку

Фильтрация по ключу с помощью флага

id: 38977_task6

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

Нужно правильно расставить в пропуски предложенные варианты
<?php
$data = ['name' => 'Alice', 1 => 'ignored', 'age' => 25, 2 => 'also ignored'];

$filtered_by_key = array_filter(
    $data,
    'is_string',
    input1S
);

print_r($filtered_by_key);
?>
ARRAY_FILTER_USE_KEY
ARRAY_FILTER_USE_BOTH
'is_string'
$data
Сообщения
Проверить
Показать решение на 3 сек.
Показать подсказку

Сколько элементов пройдет фильтрацию?

id: 38977_task7

В этом примере используется флаг `ARRAY_FILTER_USE_BOTH`, который передает в callback-функцию и значение, и ключ. Условие — значение элемента должно быть вдвое больше его ключа. Посчитайте, сколько элементов останется в массиве после такой фильтрации, и впишите число.

Что должно получиться?
<?php
$numbers = [1, 2, 6, 6, 8];

$result = array_filter(
    $numbers,
    fn($value, $key) => $value == $key * 2,
    ARRAY_FILTER_USE_BOTH
);

echo count($result);
?>
Сообщения
Проверить
Показать подсказку
НайтиКурс.Ру