Свертка с помощью '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 с текущей суммой и каждым элементом массива. Этот процесс накопления продолжается до тех пор, пока не будут обработаны все элементы, в результате чего вы получите итоговое сокращенное значение.
В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.
В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.
В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.
Задание
ЛегкоВы получите два входных значения: список чисел, разделенных запятыми, и тип операции. Первый ввод содержит числа в виде строки в формате 5,10,15,20,25, а второй ввод — это один символ, указывающий на операцию: S для суммы (sum), P для произведения (product) или M для максимума (maximum).
Прочитайте оба входных значения, преобразуйте числа, разделенные запятыми, в массив целых чисел, создайте пользовательскую функцию обратного вызова (callback), которая выполняет указанную операцию, используйте array_reduce() с вашей функцией обратного вызова и соответствующим начальным значением для обработки всех чисел в один результат и выведите окончательный результат.
Детали операций:
S(Сумма): Сложить все числа вместе (начальное значение: 0)P(Произведение): Перемножить все числа вместе (начальное значение: 1)M(Максимум): Найти наибольшее число (начальное значение: первое число в массиве или очень маленькое число)
Ваша функция обратного вызова должна принимать два параметра: накопленный результат (carry) и текущий элемент массива (item), а затем возвращать обновленное накопленное значение в зависимости от типа операции.
Формат входных данных:
- Первая строка: Числа, разделенные запятыми (пример:
5,10,15,20,25) - Вторая строка: Тип операции — либо
S,P, либоM(пример:S)
Ожидаемый результат: Одно число, представляющее собой результат операции свертки (reduce)
Шпаргалка
Функция array_reduce() обрабатывает все элементы массива для получения одного значения, что идеально подходит для вычисления итогов или объединения элементов.
Она принимает три параметра: обрабатываемый массив, callback-функцию и необязательное начальное значение. Callback-функция получает накопленный результат (carry) и текущий элемент массива.
<?php
function addNumbers($carry, $item) {
return $carry + $item;
}
$numbers = [1, 2, 3, 4, 5];
$sum = array_reduce($numbers, "addNumbers", 0);
// Результат: 15
?>Используйте number_format($total, 2) для форматирования результатов до 2 знаков после запятой.
Попробуйте сами
<?php
// Чтение входных данных
$numbers_input = trim(fgets(STDIN));
$operation = trim(fgets(STDIN));
// Преобразование строки с разделителями-запятыми в массив целых чисел
$numbers = array_map('intval', explode(',', $numbers_input));
// TODO: Напишите свой код ниже
// Создайте функцию обратного вызова на основе типа операции
// Используйте array_reduce() с вашей функцией обратного вызова и соответствующим начальным значением
// Вывод результата
echo $result;
?>В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.
Все уроки раздела Логика и управление потоком
1Продвинутые функции
Анонимные функцииЗамыкания и 'use'Стрелочные функцииCallback-функцииИспользование 'call_user_func'Функции переменныхПередача по ссылкеРекурсивные функцииИтоги: ассорти из функций4Многомерные массивы
Создание 2D-массиваДоступ к элементам 2D-массиваИзменение элементов 2D-массиваИтерация с вложенными цикламиДвумерные ассоциативные массивыИтоги: Упражнение «Простая сетка»2Продвинутая работа с массивами
Добавление с помощью 'array_push'Удаление с помощью 'array_pop'Добавление с помощью 'array_unshift'Удаление с помощью 'array_shift'Слияние индексных массивовСлияние ассоциативных массивовИзвлечение с помощью 'array_slice'Поиск значений с 'in_array'Поиск ключей с 'array_search'Итоги: Упражнение «Плейлист»3Сортировка массивов
Сортировка индексных массивов по возрастаниюСортировка индексных массивов по убываниюСортировка ассоциативных массивов по значениюСортировка ассоциативных массивов по ключуСортировка в естественном порядкеПользовательская сортировка с помощью 'usort'Итоги: Сортировка таблицы лидеров6Функции высшего порядка для массивов
Преобразование с помощью 'array_map''array_map' с пользовательской функциейФильтрация с помощью 'array_filter''array_filter' с пользовательской функциейСвертка с помощью 'array_reduce'Обход с помощью 'array_walk'Итоги: Обработка данных