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, что приведет к непредвиденным последствиям!

In case you're wondering, you can only change array values in a foreach loop. You can't change array keys.
Резюме

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

Как организовать цикл по элементам массива
Как получить доступ к ключу и значению каждого элемента
Как использовать ссылку для изменения значений при проходе цикла
Добавлено: 21 Августа 2013 03:27:41 Добавил: Андрей Ковальчук Нравится 0
Добавить
Комментарии:
Нету комментариев для вывода...