PHP

Используем foreach для прохода по всему массиву PHP

Часто нужно пройти по всем элементам массива PHP и провести какую-нибудь операцию над каждым элементом. Например, вы можете вывести каждое значение в таблицу HTML или задать каждому элементу новое значение.

В данном уроке мы рассмотрим конструкцию foreach при организации цикла по индексированным и ассоциированным массивам.

Цикл по значениям элементов
Самый простой случай использования foreach - это организация цикла по значениям в индексированном массиве. Основной синтаксис :
foreach ( $array as $value ) {
  // Делаем что-нибудь с  $value
}
 
// Здесь код выполняется после завершения цикла

Например, следующий скрипт проходит по списку режисеров в индексированном массиве и выводит имя каждого:
$directors = array( "Alfred Hitchcock", "Stanley Kubrick", "Martin Scorsese", "Fritz Lang" );
 
foreach ( $directors as $director ) {
  echo $director . "<br />";
}

Выше приведенный код выведет:

Alfred Hitchcock
Stanley Kubrick
Martin Scorsese
Fritz Lang

Цикл по ключам и значениям
А что насчет ассоциированных массивов? При использовании такого типа массивов часто нужно иметь доступ к ключу каждого элемента, так же как и к его значению. Конструкция foreach имеет способ решить поставленную задачу:
foreach ( $array as $key => $value ) {
  // Делаем что-нибудь с $key и/или с $value
}
 
// Здесь код выполняется после завершения цикла

Пример организации цикла по ассоциированному массиву с информацией о кинофильмах, выводит ключ каждого элемента и его значение в HTML списке определений:
$movie = array( "title" => "Rear Window",
                "director" => "Alfred Hitchcock",
                "year" => 1954,
                "minutes" => 112 );
 
echo "<dl>";
 
foreach ( $movie as $key => $value ) {
  echo "<dt>$key:</dt>";
  echo "<dd>$value</dd>";
}
 
echo "</dl>";

Данный скрипт при выполнении выведет:

title:
Rear Window
director:
Alfred Hitchcock
year:
1954
minutes:
112

Изменение значения элемента
А как обстоит дело с изменением значения элемента при проходе цикла? Вы можете попробовать такой код:
foreach ( $myArray as $value ) {
  $value = 123;
}

Однако, если запустить его на выполнение, то вы обнаружите, что значения в массиве не изменяются. Причина заключается в том, что foreach работает с копией значений массива, а не с оригиналом. Таким образом оригинальный массив остается нетронутым.

Для изменения значений массива вам нужна ссылка на значение. Для этого нужно поставить знак & перед переменной значения в конструкции foreach:
foreach ( $myArray as &$value ) {
  $value = 123;
}

$value становится ссылкой на значение элемента в оригинальном массиве, а значит, вы можете изменять элемент устанавливая новое значение в $value.

Ссылка - это указатель на оригинальное значение. Она похожа на ярлык в Windows, или на псевдоним в Mac OS.

Например, следующий скрипт проходит циклом каждый элемент (имя режиссера) в массиве $directors, и использует функцию PHP explode() и конструкцию list для перемены мест имени и фамилии:
$directors = array( "Alfred Hitchcock", "Stanley Kubrick", "Martin Scorsese", "Fritz Lang" );
 
// Изменяем формат имени для каждого элемента
foreach ( $directors as &$director ) {
  list( $firstName, $lastName ) = explode( " ", $director );
  $director = "$lastName, $firstName";
}
 
unset( $director );
 
// Выводим конечный результат
foreach ( $directors as $director ) {
  echo $director . "<br />";
}

Скрипт выведет:

Hitchcock, Alfred
Kubrick, Stanley
Scorsese, Martin
Lang, Fritz

Отметим, что скрипт вызывает функцию unset() для удаления переменной $director после завершения первого цикла. Это хорошая практика, если вы планируете использовать переменную позже в скрипте в другом контексте.

Если не удалять ссылку, то есть риск при дальнейшем выполнении кода случайной ссылки на последний элемент в массиве ("Lang, Fritz"), если далее использовать переменную $director, что приведет к непредвиденным последствиям!

Резюме

В данном уроке мы рассмотрели, как использовать конструкцию PHP foreach для организации цикла по элементам массива. Были рассмотрены вопросы:

Как организовать цикл по элементам массива
Как получить доступ к ключу и значению каждого элемента
Как использовать ссылку для изменения значений при проходе цикла
Теги:
foreach
Добавлено: 07 Мая 2018 07:29:23 Добавил: Андрей Ковальчук Нравится 0
Добавить
Комментарии:
Нету комментариев для вывода...