Свертка с помощью '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 для суммы, P для произведения или M для максимума.
Прочитайте оба входных значения, преобразуйте числа, разделенные запятыми, в массив целых чисел, создайте пользовательскую функцию обратного вызова, которая выполняет указанную операцию, используйте array_reduce() с вашей функцией обратного вызова и соответствующим начальным значением, чтобы обработать все числа в один результат, и выведите итоговый результат.
Детали операции:
S(Сумма): Сложите все числа вместе (начальное значение: 0)P(Произведение): Перемножьте все числа вместе (начальное значение: 1)M(Максимум): Найдите наибольшее число (начальное значение: первое число в массиве или очень маленькое число)
Ваша функция обратного вызова должна принимать два параметра: накопленный результат (carry) и текущий элемент массива (item), а затем возвращать обновленное накопленное значение в зависимости от типа операции.
Формат входных данных:
- Первая строка: Числа, разделенные запятыми (пример:
5,10,15,20,25) - Вторая строка: Тип операции — либо
S,P, либоM(пример:S)
Ожидаемый результат: Одно число, представляющее результат операции свертки (reduce)
Попробуйте сами
<?php
// Чтение входных данных
$numbers_input = trim(fgets(STDIN));
$operation = trim(fgets(STDIN));
// Преобразование строки с разделителями-запятыми в массив целых чисел
$numbers = array_map('intval', explode(',', $numbers_input));
// TODO: Напишите свой код ниже
// Создайте callback-функцию на основе типа операции
// Используйте array_reduce() с вашей callback-функцией и соответствующим начальным значением
// Вывод результата
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'Итоги: Обработка данных