Статья
Версия для печати
Обсудить на форуме
Циклы Если бы не было циклов



Циклы

Если бы не было циклов, то програмирование было бы достаточно скучным занятием. Циклы позволяют выполнять определённый код указаное количество раз, или же до тех пор, пока не выполнится какое-то условие. В языке PHP есть два типа циклов: while и for (такие циклы присущи не только PHP, они присутствуют в подавляющем большинстве языков программирования).
Циклы while проверяют условия перед или после каждого прохода (повторения) цикла, и выполняется до тех пор, пока условие не выполняется. В цикле for, перед началом выполнения, указывается количество проходов (повторений), которое не может быть изменено в процессе выполнения цикла.

Цикл while

Синтаксис этого цикла похож на синтаксис оператора if.
Код:
while(условие)
{
...код...
}

Условие цикла while относится к логическому типу. Если значение становится ложным(false), то код в фигурных скобках пропускается. Если true - код выполняется. Код выполняется пока интерпретатор не встречает закрывающую фигурную скобку }, затем услови проверяется снова, и если оно истинно, то цикл повторяется. Таким образом цикл повторяется до тех пор, пока выполняется его условие. Обратите внимание на то, что условиепроверяется каждый раз перед новым проходом (повтором), поэтому если условие будет удовлетворено уже в середине кода, то код всё равно выполнится до конца. Если нужно досрочно выйти из цикла, используйте оператор break.
Код:
$i=11;
while(--$i)
{
if(моя_функция($i) == "error")
{
break; //остановить цикл
}
++$counter; //счётчик проходов цикла
}

Если функция моя_функция() не вернёт никакой ошибки, то цикл будет выполняться 10 раз, до тех пор, пока значение $i не станет равным нулю (Ноль возвращает значение "false"). Если функция моя_функция() вернёт ошибку, то выполнится оператор break и выполнение цикла прекратится. Иногда возникает необходимость проскочить один или несколько проходов цикла и перейти к следующему, не останавливая выполнение цикла в целом. Для этого используется оператор continue.
Код:
$i=11;
while(--$i)
{
if(моя_функция($i) == "error")
{
//перейти к следующему проходу не
//увеличивая значение счётчика $counter.
continue;
}
++$counter;
}

Этот код также выполняется 10 раз, если моя_функция() не вернёт никакой ошибки. Но в противном случае цикл не останавливается, а сразу переходит к следующему проходу, не изменяя значение счётчика $counter. Если после этого значение переменноц $i всё ещё не равно нулю, цикл выполняется далее как и раньше.

Цикл do...while

Цикл do...while аналогичен циклу while, только условие здесь проверяется в конце каждого прохода.
ВНИМАНИЕ: цикл do...while ВСЕГДА выполняется как минимум один раз :

Код:
echo("<SELECT name='часть'>n");
$i=0;
do
{
echo ("t<OPTION value=$i>$i</OPTION>n");
}while (++$i < $amount);

echo("</SELECT>n");

Выполняя этот код, ноль всегда будет выводиться, как один из элементов. Количество остальных элементов будет зависеть от значения переменной $amount.

Циклы while и do...while часто используются с операторами инкремента(увеличения) и декремента(уменьшения), для указания количества проходов цикла. Цикл while также очень часто используется при чтении данных из базы данных, строк из файлов, элементов из массивов(об этом в другой статье).

Цикл for

Синтаксис цикла for немного сложнее цикла while, но часто использование этого цикла приемлемее нежели while.

Код:
for($i=1;  $i<11;  ++$i)
{
echo("$i  ");  // выводятся числа от 1 до 10
}

В следующих за ключевым словом for круглых скобках указываются 3 выражения, разделяемые точкой с запятой. Первому присваевается счётчику проходов цикла. Это выражение выполняется только при первом проходе. Следующее выражение имеет логический тип, и проверяется при каждом проходе цикла. Если его значение true, цикл продолжает повторения, если false, то выполнение цикла останавливается. Третье выражение выполняется в конце каждого рохода цикла и чаще всего используется для уменьшения или увеличения переменной цикла.

Среднее выражение чаще всего сравнивает переменную цикла с каким-то ранее установленым значением, но так бывает не всегда. В примере ниже представлен немного другой вариант использования.

Код:
for($i=1;  моя_функция($i) != "ошибка"; ++$i)
{
//выполняется код, пока моя_функция($i)
//не возвращает ошибку
}

То же самое можно сделать используя цикл while.

Код:
$i=1;
while (моя_функция($i) != "ошибка";)
{
// выполняется код, пока моя_функция($i)
//не возвращает ошибку
++$i;
}

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

Как и в других Си подобных языках, в PHP разрешается (хотя и редко встречается) оставить одно или более из трёх выражений пустыми.

Код:
for( ; ; )
{
if(моя_функция() == "стоп") break;
}

Если логическое выражение не указано, то по умолчанию возвращается true. Это может привести к зацикливанию, т.е. создать бесконечный цикл, если не использовать break, return или exit. несомненно, причина не использовать какое-либо из 3 выражений , возникает довольно-таки редко.

Совет: Всегда для начала убедитесь что условие цикла логически правильно и не приведёт к зацикливанию!



Автор: МОРОЗ
Версия для печати
Обсудить на форуме