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

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

quiz iconПроверьте себя

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

quiz iconПроверьте себя

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

challenge icon

Задание

Легко

Вы получите два входных значения: список названий продуктов, разделенных запятыми, и префикс категории. Первый ввод содержит названия продуктов в виде строки в формате 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";
}
?>
quiz iconПроверьте себя

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

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