Используем 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 для организации цикла по элементам массива. Были рассмотрены вопросы: Как организовать цикл по элементам массива Как получить доступ к ключу и значению каждого элемента Как использовать ссылку для изменения значений при проходе цикла