For (инициализация; условие; изменение)
{
оператор;
оператор;
оператор;
. . .
оператор;
}
где инициализация – устанавливает начальное значение параметра цикла,
условие – определяет условие выполнения цикла,
изменение – задает изменение параметра цикла после каждой итерации.
Действия цикла:
1. параметру цикла x присваивается его начальное значение x_нач,
2. проверяется условие выполнения цикла; если оно истинно , то выполняется тело цикла,
3. параметр цикла автоматически увеличивается на шаг, и цикл повторяется до тех пор, пока условие не становится ложным ,
4. если условие не выполняется, то цикл заканчивает работу,
5. из цикла можно выйти досрочно, используя оператор break.
Внимание! Все три составляющие в круглых скобках разделяются точками с запятой.
После круглых скобок точка с запятой не ставится.
Пример: определить сумму s натуральных чисел от 1 до 100.
Схема алгоритма:
Программа:
$s = 0;
for ($n = 1; $n <= 100; $n++) // $n – переменная цикла
$s += $n;
echo “<BR>s = $s”;
Этот же цикл можно организовать без тела цикла:
for ($n = 1; $n <= 100; $s += $n++);
Эту же задачу можно решить, суммируя числа справа налево, то есть от 100 до 1:
for ($n = 100; $n >= 1; $s += $n--);
Любая из трех составляющих (инициализация, условии, изменение) может отсутствовать, причем если отсутствует условие продолжения цикла, то считается, что оно всегда истинно, и цикл превращается в бесконечный:
for (;;);
Это бесконечный цикл. Точки с запятой в скобках должны обязательно присутствовать, даже если между ними ничего нет.
Циклы for в PHP отличаются от аналогичных циклов в Паскале своей гибкостью и большими возможностями. Первая и третья составляющие в скобках не обязательно присваивают начальное значение параметру цикла и изменяют его после каждой итерации, а вторая составляющая не обязательно является условием продолжения цикла. Любая из этих составляющих может быть любым выражением или оператором целого или вещественного типов, строкой или функцией. Но вторая составляющая всегда понимается как условие, что бы она собой ни представляла:
for (echo “<BR>Славное”; echo “<BR>море -”; echo “<BR>Байкал!”)
echo “<BR>священный”;
На экран будет выведена бесконечная последовательность:
Славное
Море -
Священный
Байкал!
Море -
Священный
Байкал!
Море -
Священный
Байкал!
. . . . .
Условие выполнения цикла проверяется перед каждой итерацией, а приращение параметра цикла может быть переменным, поэтому, в отличие от Паскаля, в PHP допускается изменение значения параметра цикла и условия продолжения цикла в теле этого же цикла.
В одном цикле for можно использовать одновременно несколько параметров цикла, которые при инициализации разделяются запятыми:
$n = 20;
for ($top=0, $bottom = n-1; $top < $bottom; $top++, $bottom--)
{
$temp = $string[$top];
$string[$top] = $string[$bottom];
$string[$bottom] = $temp;
}
Эта программа переворачивает строку символов $string[n] .
Как и в других языках программирования, в PHP разрешено использовать цикл в цикле, при этом циклы должны иметь разные параметры цикла:
$min = 6;
$max = 100000;
echo “<BR>Совершенные числа от $min до $max”;
for ($num = $min; $num <= $max; $num += 2)
{
$sum = 1;
for ($factor = 2; $factor < $num; $factor++)
{
if ($num % $factor == 0)
$sum += $factor;
}
if ($sum == $num)
echo “<BR>$num”;
}
Эта программа осуществляет поиск всех совершенных чисел от 6 до 100000.
Для досрочного прекращения выполнения цикла и выхода из него используется оператор прерывания break:
$min = 2;
$max = 1000;
for ($n = $min; $n <= $max; $n++)
{
for ($i = $min; $i < $n; $i++)
{
if ($n % $i == 0)
break;
}
if ($i == $n)
echo “<BR>$n”;
}
Эта программа осуществляет поиск всех простых чисел от 2 до 1000.
Во вложенных циклах команда break прекращает выполнение только того цикла, в котором стоит.
Для пропуска одной итерации цикла (перехода к следующей итерации) используется команда продолжения continue:
$min = 3;
$max = 100;
for ($number = $min; $number <= $max; $number++)
{
if ($number % 3 != 0)
continue;
echo “<BR>$number”;
}
Эта программа осуществляет поиск всех чисел, кратныхтрем, от 3 до 100.
Примеры:
1. Вычислить Sn – сумму n первых натуральных чисел
Алгоритм:
Sn = 0
Для i от 1 до n выполнять
Sn = Sn + i
Программа:
$sn = 0;
echo “<BR>До какого числа суммировать:”;
// ввод $n
for ($i = 1; $i <= $n; $i++)
{
$sn += $i;
}
echo “<BR>Сумма чисел от 1 до $n равна $sn”;
3. Рассортировать элементы заданного случайным образом целочисленного вектора vector[n] методом обменной сортировки (пузырька):
// инициализация генератора случайных чисел:
mt_srand(time() + (double)microtime()*1000000);
echo "<BR>Введите нижнюю границу:";
// ввод $vector_min
echo "<BR>Введите верхнюю границу:";
// ввод $vector_max
echo "<BR>Введите размер вектора:";
// ввод $n
echo "<BR>Исходный вектор:<BR>";
// получение случайного числа в диапазоне
// от vector_min до vector_max
for ($i=0; $i < $n; $i++)
{
$vector[$i]=mt_rand($vector_min, $vector_max);
echo $vector[$i], ‘ ‘;
}
echo "<BR><BR>";
for ($m = $n-2; $m >= 0; $m--)
for ($i = 0; $i <= $m; $i++)
if ($vector[$i] > $vector[$i+1])
{
$temp = $vector[$i];
$vector[$i] = $vector[$i+1];
$vector[$i+1] = $temp;
}
echo "<BR>Отсортированный вектор:<BR>";
for ($i=0; $i < $n; $i++)
{
echo $vector[$i], ‘ ‘;
}
echo "<BR><BR>";
4. Рассортировать элементы заданного случайным образом целочисленного вектора vector[n] методом Шелла (обменная сортировка с убывающим шагом). В этом случае массив делится на группы по два элемента и производится сортировка в каждой группе: максимальный элемент ставится на второе место. После этого массив делится на группы по четыре элемента, и они снова сортируются. Количество элементов в сортируемой группе удваивается до тех пор, пока не остается одна группа, включающая все элементы массива, которая и сортируется окончательно:
// инициализация генератора случайных чисел:
mt_srand(time() + (double)microtime()*1000000);
echo "<BR>Введите нижнюю границу:";
// ввод $vector_min
echo "<BR>Введите верхнюю границу:";
// ввод $vector_max
echo "<BR>Введите размер вектора:";
// ввод $n
echo "<BR>Исходный вектор:<BR>";
// получение случайного числа в диапазоне
// от vector_min до vector_max
for ($i=0; $i < $n; $i++)
{
$vector[$i]=mt_rand($vector_min, $vector_max);
echo $vector[$i], ‘ ‘;
}
echo "<BR><BR>";
$i1 = $n-1;
while ($i1 >= 1)
{
$i1 /= 2;
$i2 = $n - $i1;
do
{
$per = true;
for ($i = 0; $i <= $i2; $i++)
{
$i3 = $i + $i1;
if ($vector[$i] > $vector[$i3])
{
$temp = $vector[$i];
$vector[$i] = $vector[$i3];
$vector[$i3] = $temp;
$per = false;
} // if ($vector[$i] > $vector[$i3])
} // for ($i=0; $i<=$i2; $i++)
} // do
while (!per);
} // while ($i1>=1)
echo "<BR>Отсортированный вектор:<BR>";
for ($i=0; $i < $n; $i++)
{
echo $vector[$i], ‘ ‘;
}
echo "<BR><BR>";