Цикл foreach в PHP

Среди все имеющихся циклов в PHP, есть еще один узкого назначения, который вызывается оператором foreach. Данный цикл выполняет блок операторов исключительно для массивов. Перебор элементов массива осуществляется по порядку — от нулевого до последнего. Однако пропустить действия над каким-либо элементом можно через условный оператор и continue. В скобках foreach не нужно указывать length массива, а достаточно указать его имя. В любом случае все итерации пройдут через всю длину — не более, не менее.

Синтаксис foreach

Foreach синтаксически аналогичен for, while или dowhile, однако структура кода в скобках другая: foreach($arras $variable){operators} или foreach($arras $index=>$value).

Структура цикла:

  • foreach(){} — оператор объявления цикла;
  • $arr — массив, который предстоит обработать циклом;
  • as — оператор отношения массива к переменной;
  • $variable — переменная, которая хранит как индекс элемента при каждой итерации, так и его значение;
  • $index=>$value (для ассоциативных массивов) — первая переменная является индексом ассоциативного массива, вторая является значением;
  • operators — операторы, которые будут обрабатывать переменную массива.

Пример перебора массива:

<?php
$arr = array(«London», «Moscow», «Paris», «Helsinki»); // Создаем массив с числовыми индексами

foreach($arras $index){ // Переменная $index хранит значение одного элемента итерации
echo «$index «;
}

// Вывод: London, Moscow, Paris, Helsinki
?>

В нашем цикле было всего 4 итерации в соответствии с длиной массива. При каждой итерации, переменная $index хранит одно текущее значение элемента массива.

Перебор ассоциативных массивов

Как известно, индексом массива является не порядковый номер, а строковое значение: $arr[«name»] => «Vasya». Такая организация массива предоставляет более семантический доступ к данным, основываясь на логически связанных именах индексов. Для перебора такого массива в foreach, предусмотрена немного измененная конструкция параметра переменой.

Пример:

<?php
$weight_of_fruits = array(«banana»=>»200g», «apple»=>»150g», «strawberry»=>»20g»); // ассоциативный массив фруктов и веса каждого из них

foreach($weight_of_fruits as $fruit=>$weight){
echo «$fruit = $weigth «; // выводим имя индекса и его значение
}

// Вывод: banana = 200g apple = 150g strawberry = 20g
?>

Итерации могут осуществляться не для всех элементов, а также в зависимости от условия, можно ограничить перебор до неполного.

Пример:

<?php
foreach($weight_of_fruitsas $fruit=>$weight){ // простой вывод ассоциативных индексов
echo «$fruit «; \\ Вывод: banana apple strawberry
}

foreach($weight_of_fruits as $fruit=>$weight){
if($fruit == «strawberry») break; // перебор до предпоследнего элемента
echo «$fruit «; // Вывод: banana apple
}
?>

Как видно, мы ограничили перебор массива в цикле foreach до последнего элемента strawberry. Также мы можем пропустить итерацию над определенным элементом, установив оператор continue. Так как в рамках данного цикла нет возможности обратиться к числовым индексам, то придется использовать для этого глобальную переменную.

Пример:

$arr = array(«London», «Moscow», «Paris», «Helsinki»);
$x = 0; // переменная для хранения индекса
foreach($arras $index){
if($x == 2) continue; // Пропуск итерации на третьем элементе
echo «$arr[x] «;
$x++; // Увеличение значения переменной на 1
}
// Вывод осуществится без элемента Paris
// Вывод: London, Moscow, Helsinki
?>

Нельзя объявить переменную $x внутри цикла, так как при каждой итерации она будет возвращаться к своему начальному значению. Поэтому ее приходится объявлять в глобальном контексте. Конечно удобнее использовать неполный перебор в циклах for. Это позволит скрыть переменные индекса локально в блоке самого цикла. При этом, трудности неполного перебора в цикле foreach создаются только с числовыми индексами массива. С ассоциативным массивом можно проводить условные итерации.

Не стоит использовать foreach для многомерных массивов, так как можно легко утерять логику перебора. Для этого проще воспользоваться вложенным циклом for в for, так алгоритм будет легче для чтения и внесения правок.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *