Функция array_reduce()

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

Тренажер PHP

Функция `array_reduce()` — это один из самых универсальных и мощных инструментов в PHP для работы с массивами. Её основная идея — "свернуть" или "уменьшить" (англ. reduce) весь массив до одного-единственного значения. Это может быть сумма всех элементов, самая длинная строка, или даже новый, сложно сгруппированный массив.

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

Список тем

Основы array_reduce: Суммирование чисел

id: 38978_task1

Классический пример использования `array_reduce()` — это подсчет суммы всех элементов в массиве. Заполните пропуски в коде, чтобы правильно вызвать функцию и определить аргументы callback-функции, которые отвечают за накопление результата и текущий элемент.

Заполните пропуски
<?php
$numbers = [1, 2, 3, 4, 5];

$sum = input1S(
    $numbers,
    function (input2S, input3S) {
        $carry += $item;
        return $carry;
    },
    0
);

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

Какой будет результат конкатенации?

id: 38978_task2

Функция `array_reduce` отлично подходит не только для чисел, но и для строк. В этом примере она используется для объединения массива слов в одно предложение. Впишите, какая строка будет выведена в результате выполнения этого кода.

Что должно получиться?
<?php
$words = ['PHP', 'is', 'powerful'];

$sentence = array_reduce($words, function ($carry, $item) {
    if ($carry === '') {
        return $item;
    }
    return $carry . ' ' . $item;
}, '');

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

Роль начального значения (initial)

id: 38978_task3

Третий аргумент `array_reduce()` — это начальное значение для "аккумулятора" (`$carry`). Если его указать, итерации начнутся с него. Проанализируйте код, который вычисляет произведение чисел, но с начальным значением `2`, и выберите правильный результат.

Выберите правильный вариант ответа
<?php
$numbers = [3, 4, 5];

$product = array_reduce(
    $numbers,
    fn($carry, $item) => $carry * $item,
    2 // Начальное значение
);

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

Найдите ошибку: забытый return

id: 38978_task4

Самая частая ошибка при использовании `array_reduce` — забыть вернуть новое значение аккумулятора из callback-функции. В этом коде пытаются найти самое большое число, но из-за ошибки результат `null`. Найдите и исправьте строку с ошибкой.

Найдите ошибку и исправьте
<?php
$numbers = [10, 45, 23, 98, 55];
 
$max = array_reduce($numbers, function($carry, $item) {
    if ($item > $carry) {
        return $item;
    }
    // Ошибка здесь
});
 
var_dump($max);
?>
Сообщения
Проверить
Показать решение на 3 сек.
Показать подсказку

Подсчет общей стоимости товаров в корзине

id: 38978_task5

Соберите из разрозненных строк кода скрипт для подсчета общей стоимости товаров в корзине. У каждого товара есть цена и количество. Вам нужно "свернуть" массив корзины в одно число — итоговую сумму.

Перетяните в правильном порядке строки из одного блока в другой
echo "Total: " . $total_cost;
$cart = [['price' => 10, 'qty' => 2], ['price' => 5, 'qty' => 5]];
<?php
$total_cost = array_reduce($cart, $callback, 0);
$callback = fn($carry, $item) => $carry + ($item['price'] * $item['qty']);
?>
$total_cost = 0;
foreach($cart as $item) {}
Сообщения
Проверить
Показать решение на 3 сек.
Показать подсказку

Группировка по ключу

id: 38978_task6

Используя `array_reduce`, можно преобразовывать один массив в другой, например, в ассоциативный. В этом задании нужно преобразовать плоский массив пользователей в ассоциативный, где ключом будет `id` пользователя. Заполните пропуски из банка токенов.

Нужно правильно расставить в пропуски предложенные варианты
<?php
$users = [
    ['id' => 101, 'name' => 'Alice'],
    ['id' => 102, 'name' => 'Bob'],
];

$users_by_id = array_reduce($users, function($carry, $item) {
    input1S[ input2S ] = $item;
    input3S;
}, input4S);

print_r($users_by_id);
?>
$carry
$item['id']
return $carry
[]
$item
Сообщения
Проверить
Показать решение на 3 сек.
Показать подсказку

Какой будет баланс?

id: 38978_task7

Представьте, что у вас есть массив транзакций (положительные числа - пополнения, отрицательные - списания). Используя `array_reduce` и начальный баланс 1000, посчитайте итоговый баланс на счете. Впишите конечное число.

Что должно получиться?
<?php
$transactions = [200, -50, 300, -150];
$initial_balance = 1000;

$final_balance = array_reduce(
    $transactions,
    fn($balance, $transaction) => $balance + $transaction,
    $initial_balance
);

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