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;
}
?>
С этой темой смотрят: