Menu
CoddyTech

Свертка с помощью 'array_reduce'

Часть раздела Логика и управление потоком путешествия по PHP на Coddy. Урок 43 из 68.

Функция array_reduce() работает иначе, чем array_map() и array_filter(). Вместо возврата нового массива она обрабатывает все элементы массива, чтобы получить одно значение. Это делает её идеальной для таких операций, как вычисление суммы, поиск максимальных значений или объединение всех элементов в один результат.

Функция принимает массив для обработки и функцию обратного вызова, которая задаёт способ объединения элементов, а также необязательный третий параметр: начальное значение. Функция обратного вызова получает два параметра: накопленный результат (называемый «carry») и текущий элемент массива.

<?php
function addNumbers($carry, $item) {
    return $carry + $item;
}

$numbers = [1, 2, 3, 4, 5];
$sum = array_reduce($numbers, "addNumbers", 0);
// Результат: 15
?>

В этом примере функция начинает работу с начального значения 0, затем многократно вызывает addNumbers, передавая ей текущую сумму и каждый элемент массива. Этот процесс накопления продолжается до тех пор, пока не будут обработаны все элементы, оставляя вам итоговое значение после свёртки.

challenge icon

Задание

Легко

Вы получите два входных значения: список чисел, разделённых запятыми, и тип операции. Первое входное значение содержит числа в виде строки в формате 5,10,15,20,25, а второе — один символ, указывающий на операцию: S для суммы, P для произведения или M для максимума.

Считайте оба входных значения, преобразуйте числа, разделённые запятыми, в массив целых чисел, создайте пользовательскую функцию обратного вызова, выполняющую указанную операцию, используйте array_reduce() с вашей функцией обратного вызова и подходящим начальным значением, чтобы обработать все числа и получить один результат, а затем выведите итоговый результат.

Подробности операций:

  • S (Сумма): сложите все числа (начальное значение: 0)
  • P (Произведение): перемножьте все числа (начальное значение: 1)
  • M (Максимум): найдите наибольшее число (начальное значение: первое число в массиве или очень маленькое число)

Ваша функция обратного вызова должна принимать два параметра: накопленный результат (carry) и текущий элемент массива (item), а затем возвращать обновлённое накопленное значение в зависимости от типа операции.

Формат входных данных:

  • Первая строка: числа, разделённые запятыми (пример: 5,10,15,20,25)
  • Вторая строка: тип операции — S, P или M (пример: S)

Ожидаемый вывод: одно число, представляющее результат операции свёртки

Попробуйте сами

<?php
// Считайте входные данные
$numbers_input = trim(fgets(STDIN));
$operation = trim(fgets(STDIN));

// Преобразуйте строку с разделителями-запятыми в массив целых чисел
$numbers = array_map('intval', explode(',', $numbers_input));

// TODO: Напишите свой код ниже
// Создайте функцию обратного вызова в зависимости от типа операции
// Используйте array_reduce() с вашей функцией обратного вызова и подходящим начальным значением


// Выведите результат
echo $result;
?>
quiz iconПроверьте себя

В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.

Все уроки раздела Логика и управление потоком

Потренируйтесь самостоятельно: Онлайн-компилятор PHP