Reg.ru: домены и хостинг

Крупнейший регистратор и хостинг-провайдер в России.

Более 2 миллионов доменных имен на обслуживании.

Продвижение, почта для домена, решения для бизнеса.

Более 700 тыс. клиентов по всему миру уже сделали свой выбор.

Перейти на сайт->

Бесплатный Курс "Практика HTML5 и CSS3"

Освойте бесплатно пошаговый видеокурс

по основам адаптивной верстки

на HTML5 и CSS3 с полного нуля.

Начать->

Фреймворк Bootstrap: быстрая адаптивная вёрстка

Пошаговый видеокурс по основам адаптивной верстки в фреймворке Bootstrap.

Научитесь верстать просто, быстро и качественно, используя мощный и практичный инструмент.

Верстайте на заказ и получайте деньги.

Получить в подарок->

Бесплатный курс "Сайт на WordPress"

Хотите освоить CMS WordPress?

Получите уроки по дизайну и верстке сайта на WordPress.

Научитесь работать с темами и нарезать макет.

Бесплатный видеокурс по рисованию дизайна сайта, его верстке и установке на CMS WordPress!

Получить в подарок->

*Наведите курсор мыши для приостановки прокрутки.


Применение функции к каждому элементу массива

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

Иными словами, нам нужно произвести определенное преобразование для всего набора данных.

На помощь нам спешит функция под названием 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().

Понравился материал и хотите отблагодарить?
Просто поделитесь с друзьями и коллегами!


Смотрите также:

PHP: Получение информации об объекте или классе, методах, свойствах и наследовании

PHP: Получение информации об объекте или классе, методах, свойствах и наследовании

CodeIgniter: жив или мертв?

CodeIgniter: жив или мертв?

Функции обратного вызова, анонимные функции и механизм замыканий

Функции обратного вызова, анонимные функции и механизм замыканий

Слияние массивов. Преобразование массива в строку

Слияние массивов. Преобразование массива в строку

Деструктор и копирование объектов с помощью метода __clone()

Деструктор и копирование объектов с помощью метода __clone()

Эволюция веб-разработчика или Почему фреймворк - это хорошо?

Эволюция веб-разработчика или Почему фреймворк - это хорошо?

Магические методы в PHP или методы-перехватчики (сеттеры, геттеры и др.)

Магические методы в PHP или методы-перехватчики (сеттеры, геттеры и др.)

PHP: Удаление элементов массива

PHP: Удаление элементов массива

Ключевое слово final (завершенные классы и методы в PHP)

Ключевое слово final (завершенные классы и методы в PHP)

50 классных сервисов, программ и сайтов для веб-разработчиков

50 классных сервисов, программ и сайтов для веб-разработчиков

Наверх