for
циклы — самые сложные циклы в PHP. Они ведут себя как их аналоги C. Синтаксис for
цикла:
for (expr1; expr2; expr3)
statement
Первое выражение ( expr1 ) оценивается (выполняется) один раз безоговорочно в начале цикла.
В начале каждой итерации оценивается expr2 . Если он оценивается как true
, цикл продолжается и выполняются вложенные операторы. Если он оценивается как false
, выполнение цикла завершается.
В конце каждой итерации expr3 оценивается (выполняется).
Каждое из выражений может быть пустым или содержать несколько выражений, разделенных запятыми. В expr2 оцениваются все выражения, разделенные запятой, но результат берется из последней части. Пустое выражение expr2 означает, что цикл должен выполняться бесконечно (PHP неявно рассматривает его как true
, как C). Это может быть не так бесполезно, как вы думаете, поскольку часто вы хотите завершить цикл, используя условный break
оператор, а не for
выражение истинности.
Рассмотрим следующие примеры. Все они отображают числа от 1 до 10:
<?php
/* example 1 */
for ($i = 1; $i <= 10; $i++) {
echo $i;
}
/* example 2 */
for ($i = 1; ; $i++) {
if ($i > 10) {
break;
}
echo $i;
}
/* example 3 */
$i = 1;
for (; ; ) {
if ($i > 10) {
break;
}
echo $i;
$i++;
}
/* example 4 */
for ($i = 1, $j = 0; $i <= 10; $j += $i, print $i, $i++);
?>
Конечно, первый пример кажется самым красивым (или, возможно, четвертым), но вы можете обнаружить, что возможность использовать пустые выражения в for
циклах оказывается полезной во многих случаях.
PHP также поддерживает альтернативный «синтаксис с двоеточием» для for
циклов.
for (expr1; expr2; expr3):
statement
...
endfor;
Многие пользователи часто перебирают массивы, как в примере ниже.
<?php
/*
* This is an array with some data we want to modify
* when running through the for loop.
*/
$people = array(
array('name' => 'Kalle', 'salt' => 856412),
array('name' => 'Pierre', 'salt' => 215863)
);
for($i = 0; $i < count($people); ++$i) {
$people[$i]['salt'] = mt_rand(000000, 999999);
}
?>
Приведенный выше код может быть медленным, поскольку размер массива извлекается на каждой итерации. Поскольку размер никогда не меняется, цикл можно легко оптимизировать, используя промежуточную переменную для хранения размера вместо многократного вызова count() :
<?php
$people = array(
array('name' => 'Kalle', 'salt' => 856412),
array('name' => 'Pierre', 'salt' => 215863)
);
for($i = 0, $size = count($people); $i < $size; ++$i) {
$people[$i]['salt'] = mt_rand(000000, 999999);
}
?>
0 комментариев