Menu
Coddy logo textTech

Обход с помощью 'array_walk'

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

Функция array_walk() предлагает другой подход к обработке массивов по сравнению с array_map(). В то время как array_map() создаёт новый массив с преобразованными значениями, array_walk() напрямую изменяет исходный массив, применяя функцию callback к каждому элементу на месте.

Эта function особенно полезна, когда вы хотите изменить существующий array, не создавая копию. Предоставленная вами callback function получает каждый элемент array по ссылке, что позволяет напрямую modify исходные значения.

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

$items = ["apple", "banana", "orange"];
array_walk($items, "addPrefix");
// $items теперь: ["Item: apple", "Item: banana", "Item: orange"]
?>

Обратите внимание, как callback function использует &$value, чтобы получить элемент array по ссылке. Это позволяет function напрямую modify исходный элемент array. Второй параметр $key предоставляет доступ к ключу текущего элемента, хотя для простых преобразований он нужен не всегда.

array_walk() также поддерживает optional third argument, который позволяет передать extra data непосредственно в вашу callback function. Это полезно, когда ваше преобразование зависит от значения, определённого вне array, например prefix, суффикса или любого другого динамического ввода.

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

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

$products = ["laptop", "mouse", "keyboard"];
$prefix = "Electronics";
array_walk($products, "addCategory", $prefix);
// $products is now: ["Electronics: laptop", "Electronics: mouse", "Electronics: keyboard"]
?>

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

challenge icon

Задание

Легко

Вы получите два входных значения: список product names, разделённых запятыми, и category prefix. Первый ввод содержит product names как string в формате laptop,mouse,keyboard,monitor, а второй ввод представляет собой текст category prefix (пример: Electronics).

Прочитайте оба ввода, преобразуйте разделённые запятыми product names в array, создайте callback function, которая добавляет category prefix к каждому product name в формате "Category: ProductName", используйте array_walk() вместе с вашей callback function, чтобы напрямую modify исходный array, и выведите каждый modified product name в отдельной строке.

Ваша callback function должна использовать параметр &$value, чтобы изменять элементы array по ссылке. Function должна объединять category prefix с двоеточием и пробелом, за которыми следует product name.

Формат ввода:

  • Первая строка: разделённые запятыми product names (пример: laptop,mouse,keyboard,monitor)
  • Вторая строка: текст category prefix (пример: Electronics)

Ожидаемый вывод: Каждый modified product name выводится в отдельной строке в формате Category: ProductName

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

<?php
// Прочитать имена продуктов, разделённые запятыми
$products_input = trim(fgets(STDIN));

// Прочитать префикс категории
$category = trim(fgets(STDIN));

// Преобразовать строку, разделённую запятыми, в массив
$products = explode(',', $products_input);

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


// Вывести каждое изменённое имя продукта на отдельной строке
foreach ($products as $product) {
    echo $product . "\n";
}
?>
quiz iconПроверьте себя

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

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

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