Применение функции к каждому элементу массива
Одна из частых задач, с которой приходится сталкиваться при работе с массивами данных - это ситуация, когда необходимо с каждым элементом массива выполнить некое действие или прогнать его через какую-либо функцию.
Иными словами, нам нужно произвести определенное преобразование для всего набора данных.
На помощь нам спешит функция под названием 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() работает «по месту», т.е. не возвращает измененную копию массива. Что это значит для нас? Это значит, что если нам нужно на самом деле изменить элементы массива, то значения должны передаваться по ссылке.
— Регулярная проверка качества ссылок по более чем 100 показателям и ежедневный пересчет показателей качества проекта.
— Все известные форматы ссылок: арендные ссылки, вечные ссылки, публикации (упоминания, мнения, отзывы, статьи, пресс-релизы).
— SeoHammer покажет, где рост или падение, а также запросы, на которые нужно обратить внимание.
SeoHammer еще предоставляет технологию Буст, она ускоряет продвижение в десятки раз, а первые результаты появляются уже в течение первых 7 дней. Зарегистрироваться и Начать продвижение
В таких случаях, как в приведенном примере, перед именем параметра ставится символ &. Тем не менее это необходимо только тогда, когда вы хотите изменить массив - в противном случае амперсанд не используется.
Второй вариант - это работа с набором вложенных массивов. Здесь нам на выручку приходит функция 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().
Понравился материал и хотите отблагодарить?
Просто поделитесь с друзьями и коллегами!
Смотрите также: