PHP: Перебор элементов массива
Цикл foreach осуществляет последовательный перебор всех элементов массива. Он работает только с массивами и объектами, а в случае его использования с переменными других типов или неинициализированными переменными будет сгенерирована ошибка.
Есть два вида синтаксиса для данного цикла. Первый вид синтаксиса цикла foreach выглядит следующим образом:
foreach ($array as $value) { инструкции }
Цикл будет перебирать заданный массив - $array
(вместо $array
подставляется название массива). На каждой итерации значение текущего элемента присваивается переменной $value
(можно указать любое другое имя переменной).
Оператор цикла foreach
очень удобен, поскольку сам выполняет обход и чтение всех элементов массива, пока не будет достигнут последний. Он позволяет не держать постоянно в памяти тот факт, что индексация массивов начинается с нуля, и никогда не выходит за пределы массива, что делает конструкцию цикла очень удобной и помогает избежать распространенных ошибок.
Посмотрим, как он работает на примере:
<?php $my_arr = array(1, 2, 3, 4, 5); foreach ($my_arr as $value) { echo $value, " "; } ?>
Второй вид синтаксиса foreach, выглядит так:
foreach ($array as $key => $value) { инструкции }
При использовании данной формы синтаксиса на каждой итерации дополнительно присваивается значение текущего ключа переменной $key
(можно указать любое другое имя переменной):
<?php $my_arr = array(1, 2, 3, 4, 5); foreach ($my_arr as $key => $value) { echo "[$key] => ", $value, "<br>"; } ?>
Чтобы можно было напрямую изменять элементы массива внутри цикла, нужно использовать ссылку. В этом случае значение будет присвоено по ссылке.
<?php $my_arr = array(1, 2, 3); foreach ($my_arr as &$value) { $value *= 2; echo $value; } /* это нужно для того, чтобы последующие записи в переменную $value не меняли последний элемент массива */ unset($value); // разорвать ссылку на последний элемент ?>
foreach
завершил работу. Поэтому рекомендуется удалять ее с помощью функции unset()
как показано в примере выше. Давайте посмотрим что будет, если не использовать unset()
:
<?php $numbers = array(1,2,3,4,5); foreach ($numbers as &$num) { echo $num, " "; } // Присваиваем новое значение переменной $num $num = '100'; echo '<br>'; foreach ($numbers as &$num) { echo $num, " "; } ?>Стоит отметить следующий момент, ссылку можно использовать только если перебираемый массив является переменной. Следующий код не будет работать:
<?php foreach (array(1, 2, 3) as &$value) { $value *= 2; } ?>
С этой темой смотрят: