Все ленты — последние статьи

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

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

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

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

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

 

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

Выше приведенный код выведет:
1 Alfred Hitchcock
2 Stanley Kubrick
3 Martin Scorsese
4 Fritz Lang
Цикл по ключам и значениям

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

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

Данный скрипт при выполнении выведет:
1 title:
2 Rear Window
3 director:
4 Alfred Hitchcock
5 year:
6 1954
7 minutes:
8 112
Изменение значения элемента

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

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

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

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

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

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

Скрипт выведет:
1 Hitchcock, Alfred
2 Kubrick, Stanley
3 Scorsese, Martin
4 Lang, Fritz

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

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

Резюме

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

Как организовать цикл по элементам массива
Как получить доступ к ключу и значению каждого элемента
Как использовать ссылку для изменения значений при проходе цикла