Например, вы можете вывести каждое значение в таблицу 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
, что приведет к непредвиденным последствиям!