
Reg.ru: домены и хостинг
Крупнейший регистратор и хостинг-провайдер в России.
Более 2 миллионов доменных имен на обслуживании.
Продвижение, почта для домена, решения для бизнеса.
Более 700 тыс. клиентов по всему миру уже сделали свой выбор.

Бесплатный Курс "Практика HTML5 и CSS3"
Освойте бесплатно пошаговый видеокурс
по основам адаптивной верстки
на HTML5 и CSS3 с полного нуля.

Фреймворк Bootstrap: быстрая адаптивная вёрстка
Пошаговый видеокурс по основам адаптивной верстки в фреймворке Bootstrap.
Научитесь верстать просто, быстро и качественно, используя мощный и практичный инструмент.
Верстайте на заказ и получайте деньги.
*Наведите курсор мыши для приостановки прокрутки.
Применение функции к каждому элементу массива
Одна из частых задач, с которой приходится сталкиваться при работе с массивами данных - это ситуация, когда необходимо с каждым элементом массива выполнить некое действие или прогнать его через какую-либо функцию.
Иными словами, нам нужно произвести определенное преобразование для всего набора данных.
На помощь нам спешит функция под названием array_walk():
$names = array('firstname' => "Baba", 'lastname' => "O'Riley"); array_walk($names, function (&$value, $key) { $value = htmlentities($value, ENT_QUOTES); }); foreach ($names as $name) { print "$name<br>"; }
На выходе получим:
Baba O'Riley
Все хорошо, когда мы имеем дело с простыми массивами, но как быть, если у нас есть вложенные данные?
Для этого случая есть столь же удобная функция array_walk_recursive():
$names = array('firstnames' => array("Baba", "Bill"), 'lastnames' => array("O'Riley", "O'Reilly")); array_walk_recursive($names, function (&$value, $key) { $value = htmlentities($value, ENT_QUOTES); }); foreach ($names as $nametypes) { foreach ($nametypes as $name) { print "$name<br>"; } }
Результатом работы этого кода будет вывод на экран следующих данных:
Baba Bill O'Riley O'Reilly
Детали
Очень часто для перебора элементов массива используются циклы. Один из основных вариантов - это цикл foreach.
Но, помимо него, можно воспользоваться функцией и функцией array_walk(), пример работы которой вы видели чуть выше.
Данная функция принимает массив и анонимную функцию обратного вызова, которая и занимается обработкой всех элементов массива.
Функция обратного вызова получает два параметра: значение и ключ. Кроме того, для нее предусмотрен и необязательный третий параметр с дополнительными данными, которые могут использоваться в этой же самой функции.
Пример ниже обеспечивает кодирование всех данных в массиве $names по правилам HTML.
Анонимная функция обратного вызова получает значения из массива, передает их функции htmlentities() для кодирования ключевых сущностей HTML и заносит результат в переменную $value:
$names = array('firstname' => "Baba", 'lastname' => "O'Riley"); array_walk($names, function (&$value, $key) { $value = htmlentities($value, ENT_QUOTES); }); foreach ($names as $name) { print "$name\n"; }
Результат:
Baba O'Riley
Функция array_walk() работает «по месту», т.е. не возвращает измененную копию массива. Что это значит для нас? Это значит, что если нам нужно на самом деле изменить элементы массива, то значения должны передаваться по ссылке.
В таких случаях, как в приведенном примере, перед именем параметра ставится символ &. Тем не менее это необходимо только тогда, когда вы хотите изменить массив - в противном случае амперсанд не используется.
Второй вариант - это работа с набором вложенных массивов. Здесь нам на выручку приходит функция array_walk_recursive():
$names = array('firstnames' => array("Baba", "Bill"), 'lastnames' => array("O'Riley", "O'Reilly")); array_walk_recursive($names, function (&$value, $key) { $value = htmlentities($value, ENT_QUOTES); }); foreach ($names as $nametypes) { foreach ($nametypes as $name) { print "$name\n"; } }
Результат будет следующий:
Baba Bill O'Riley O'Reilly
При этом нужно помнить, что функция array_walk_recursive() передает функции обратного вызова только элементы, не являющиеся массивами, так что нам не придется изменять функцию обратного вызова при переходе с array_walk().
Понравился материал и хотите отблагодарить?
Просто поделитесь с друзьями и коллегами!
Смотрите также: