Функция array_walk()

Тренажер по PHP для пользователей с начальным уровнем подготовки.

Тренажер PHP

Функция `array_walk()` — это особый инструмент для работы с массивами, который часто путают с `array_map()`. Ключевое отличие в том, что `array_walk()` не создает новый массив. Её главная задача — применить заданную callback-функцию к каждому элементу массива, чтобы выполнить какое-то действие. Чаще всего её используют для изменения самого исходного массива "на месте".

Этот набор заданий поможет вам понять эту разницу и освоить `array_walk()`. Мы начнем с основ, сравнивая её с `array_map()`, научимся изменять элементы массива по ссылке, разберем типичные ошибки и рассмотрим более сложные случаи использования с дополнительными параметрами. Задания варьируются от заполнения пропусков до предсказания результата, чтобы вы могли уверенно применять `array_walk()` в своих проектах.

Список тем

array_walk vs. array_map: Ключевые различия

id: 38979_task1

Прежде чем начать, важно понять фундаментальную разницу между `array_walk()` и `array_map()`. Они обе проходят по массиву, но их цели и результаты совершенно разные. Сопоставьте описания действий в левом столбце с соответствующей функцией в правом.

Сопоставьте строки в правой части с соответствующими строками в левой по порядковому номеру
Возвращает новый массив, не изменяя исходный
Предназначена для изменения исходного массива (по ссылке)
Возвращает `true` или `false`, а не массив
Результат работы — всегда новый массив
array_walk()
array_walk()
array_map()
array_map()
Сообщения
Проверить
Показать подсказку

Изменение массива по ссылке

id: 38979_task2

Главная сила `array_walk()` — в возможности изменять исходный массив. Чтобы это работало, значение в callback-функции должно передаваться по ссылке. Добавьте необходимый символ в код, чтобы удвоить каждое число в массиве `$numbers`.

Заполните пропуски
<?php
$numbers = [1, 2, 3, 4];

array_walk($numbers, function(input1S$value, $key) {
    $value *= 2;
});

print_r($numbers);
?>
Сообщения
Проверить
Показать решение на 3 сек.
Показать подсказку

Что произойдет без ссылки?

id: 38979_task3

Программист хотел преобразовать все строки в массиве к верхнему регистру, но забыл один важный символ в callback-функции. Внимательно посмотрите на код и выберите, что в итоге выведет `print_r`.

Выберите правильный вариант ответа
<?php
$colors = ['red', 'green', 'blue'];

array_walk($colors, function($value, $key) {
    $value = strtoupper($value);
});

print_r($colors);
?>
Сообщения
Проверить
Показать подсказку

Исправьте ошибку с возвращаемым значением

id: 38979_task4

Программист, привыкший к `array_map()`, попытался присвоить результат `array_walk()` новой переменной. Это привело к неожиданному результату. Исправьте строку, где происходит присваивание, и строку вывода, чтобы код корректно изменял и выводил массив.

Найдите ошибку и исправьте
<?php
$items = ['book', 'pen'];
 
$modified_items = array_walk($items, function(&$item) {
    $item = 'item_' . $item;
});
 
print_r($modified_items);
?>
Сообщения
Проверить
Показать решение на 3 сек.
Показать подсказку

Сборка скрипта для форматирования отчета

id: 38979_task5

Соберите из разрозненных строк кода скрипт, который проходит по массиву с данными о продажах и форматирует каждую запись. Callback-функция должна изменять каждый элемент, добавляя к нему ключ в виде префикса.

Перетяните в правильном порядке строки из одного блока в другой
$sales = ['apples' => 50, 'oranges' => 30];
});
print_r($sales);
array_walk($sales, function (&$value, $key) {
<?php
    $value = "$key: $value units";
print_r($value);
?>
Сообщения
Проверить
Показать решение на 3 сек.
Показать подсказку

Использование третьего аргумента (userdata)

id: 38979_task6

Функция `array_walk` может принимать третий аргумент, который будет доступен внутри callback-функции. Это удобно для передачи дополнительной информации. В этом задании нужно увеличить каждую цену в массиве на величину налога, переданного как `userdata`. Заполните пропуски из банка.

Нужно правильно расставить в пропуски предложенные варианты
<?php
$prices = ['t-shirt' => 20, 'jeans' => 50];
$tax_rate = 0.1; // 10%

array_walk($prices, function(input1S, $key, input2S) {
    $price += $price * $tax_rate;
}, input3S);

print_r($prices);
?>
&$price
$tax_rate
$tax_rate
$prices
$key
Сообщения
Проверить
Показать решение на 3 сек.
Показать подсказку

Что будет выведено?

id: 38979_task7

Этот код использует `array_walk` для вывода информации, но не для изменения массива. Внутри callback-функции есть условие. Проанализируйте код и напишите, что именно будет выведено на экран. Учтите все переносы строк.

Что должно получиться?
<?php
$users = ['admin', 'guest', 'editor'];

array_walk($users, function($value, $key) {
    if ($value === 'admin') {
        echo "Main user: $value\n";
    } else {
        echo "Regular user: $value\n";
    }
});
?>
Сообщения
Проверить
Показать подсказку
НайтиКурс.Ру