Menu
Coddy logo textTech

Обход с помощью '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() также поддерживает необязательный третий аргумент, который позволяет передавать дополнительные данные непосредственно в вашу функцию обратного вызова. Это полезно, когда ваше преобразование зависит от значения, определенного вне массива — например, префикса, суффикса или любого другого динамического ввода.

Когда вы передаете третий аргумент в array_walk(), ваша функция обратного вызова получает его в качестве третьего параметра:

<?php
function addCategory(&$value, $key, $category) {
    $value = $category . ": " . $value;
}

$products = ["laptop", "mouse", "keyboard"];
$prefix = "Electronics";
array_walk($products, "addCategory", $prefix);
// $products теперь: ["Electronics: laptop", "Electronics: mouse", "Electronics: keyboard"]
?>

Здесь $prefix передается в качестве третьего аргумента в array_walk(), а функция обратного вызова получает его как $category. Таким образом, вы можете повторно использовать ту же функцию обратного вызова с различными префиксами, не прописывая значения жестко внутри нее.

challenge icon

Задание

Легко

Вы получите два входных значения: список названий товаров, разделенных запятыми, и префикс категории. Первое входное значение содержит названия товаров в виде строки в формате laptop,mouse,keyboard,monitor, а второе входное значение — это текст префикса категории (например: Electronics).

Прочитайте оба входных значения, преобразуйте названия товаров, разделенные запятыми, в массив, создайте функцию обратного вызова, которая добавляет префикс категории к каждому названию товара в формате "Category: ProductName", используйте array_walk() с вашей функцией обратного вызова для прямого изменения исходного массива и выведите каждое измененное название товара на отдельной строке.

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

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

  • Первая строка: Названия товаров, разделенные запятыми (например: laptop,mouse,keyboard,monitor)
  • Вторая строка: Текст префикса категории (например: Electronics)

Ожидаемый результат: Каждое измененное название товара, выведенное на отдельной строке в формате Category: ProductName

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

<?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";
}
?>
quiz iconПроверьте себя

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

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