Обход с помощью 'array_walk'
Часть раздела Логика и управление потоком путешествия по PHP на Coddy — урок 44 из 68.
Функция array_walk() предлагает иной подход к обработке массивов по сравнению с array_map(). В то время как array_map() создает новый массив с преобразованными значениями, array_walk() изменяет исходный массив напрямую, применяя функцию обратного вызова к каждому элементу на месте.
Эта функция особенно полезна, когда вы хотите изменить существующий массив без создания копии. Предоставляемая вами функция обратного вызова получает каждый элемент массива по ссылке, что позволяет вам изменять исходные значения напрямую.
<?php
function addPrefix(&$value, $key) {
$value = "Item: " . $value;
}
$items = ["apple", "banana", "orange"];
array_walk($items, "addPrefix");
// $items теперь: ["Item: apple", "Item: banana", "Item: orange"]
?>Обратите внимание, как функция обратного вызова использует &$value для получения элемента массива по ссылке. Это позволяет функции изменять исходный элемент массива напрямую. Второй параметр $key предоставляет доступ к ключу текущего элемента, хотя это не всегда необходимо для простых преобразований.
array_walk() также принимает необязательный третий аргумент — дополнительные данные, которые передаются непосредственно в вашу callback-функцию в качестве третьего параметра. Это полезно, когда ваше преобразование зависит от значения, определенного вне массива.
<?php
function addPrefix(&$value, $key, $prefix) {
$value = $prefix . $value;
}
$items = ["apple", "banana", "orange"];
array_walk($items, "addPrefix", "Item: ");
// $items теперь: ["Item: apple", "Item: banana", "Item: orange"]
?>Здесь строка
"Item: " передается в качестве третьего аргумента в array_walk() и принимается как $prefix внутри callback-функции. Это позволяет повторно использовать одну и ту же callback-функцию с различными дополнительными значениями.В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.
В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.
В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.
Задание
ЛегкоВы получите два входных значения: список названий продуктов, разделенных запятыми, и префикс категории. Первый ввод содержит названия продуктов в виде строки в формате laptop,mouse,keyboard,monitor, а второй ввод — это текст префикса категории (например: Electronics).
Прочитайте оба входных значения, преобразуйте строку с названиями продуктов в массив, создайте функцию обратного вызова (callback), которая добавляет префикс категории к каждому названию продукта в формате "Category: ProductName", используйте array_walk() с вашей функцией обратного вызова для прямого изменения исходного массива и выведите каждое измененное название продукта на отдельной строке.
Ваша функция обратного вызова должна использовать параметр &$value для изменения элементов массива по ссылке. Функция должна объединять префикс категории с двоеточием и пробелом, за которыми следует название продукта.
Формат входных данных:
- Первая строка: Названия продуктов через запятую (например:
laptop,mouse,keyboard,monitor) - Вторая строка: Текст префикса категории (например:
Electronics)
Ожидаемый результат: Каждое измененное название продукта, напечатанное на отдельной строке в формате Category: ProductName
Шпаргалка
Функция array_walk() изменяет исходный массив напрямую, применяя callback-функцию к каждому элементу на месте, в отличие от array_map(), которая создает новый массив.
Callback-функция получает каждый элемент массива по ссылке с помощью &$value, что позволяет напрямую изменять исходные значения. Второй параметр $key предоставляет доступ к ключу текущего элемента.
array_walk() также принимает необязательный третий аргумент — дополнительные данные, которые передаются в callback-функцию в качестве третьего параметра. Это полезно, когда вашей callback-функции требуется дополнительная информация для обработки каждого элемента.
<?php
function addPrefix(&$value, $key) {
$value = "Item: " . $value;
}
$items = ["apple", "banana", "orange"];
array_walk($items, "addPrefix");
// $items теперь: ["Item: apple", "Item: banana", "Item: orange"]
// Использование необязательного третьего аргумента (дополнительные данные):
function applyPrefix(&$value, $key, $prefix) {
$value = $prefix . $value;
}
$fruits = ["apple", "banana", "orange"];
array_walk($fruits, "applyPrefix", "Fresh: ");
// $fruits теперь: ["Fresh: apple", "Fresh: banana", "Fresh: orange"]
?>Попробуйте сами
<?php
// Прочитать названия товаров, разделенные запятыми
$products_input = trim(fgets(STDIN));
// Прочитать префикс категории
$category = trim(fgets(STDIN));
// Преобразовать строку с разделителями-запятыми в массив
$products = explode(',', $products_input);
// TODO: Напишите свой код ниже
// Создать callback-функцию, которая изменяет каждое название товара, добавляя префикс категории
// Использовать array_walk() с вашей callback-функцией для изменения массива
// Вывести каждое измененное название товара на новой строке
foreach ($products as $product) {
echo $product . "\n";
}
?>В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.
Все уроки раздела Логика и управление потоком
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'Итоги: Обработка данных