Операторы циклов в Java: for, while и do … while. Вложенные циклы.
for
(PHP 4, PHP 5, PHP 7, PHP
Цикл for самый сложный цикл в PHP.Он ведёт себя так же, как и в языке C. Синтаксис цикла for следующий:
Первое выражение (expr1) всегда вычисляется (выполняется) только один раз в начале цикла.
В начале каждой итерации оценивается выражение expr2. Если оно принимает значение true, то цикл продолжается и выполняются вложенные операторы. Если оно принимает значение false, выполнение цикла заканчивается.
В конце каждой итерации выражение expr3 вычисляется (выполняется).
Каждое из выражений может быть пустым или содержать несколько выражений, разделённых запятыми. В expr2 все выражения, разделённые запятыми, вычисляются, но результат берётся из последнего. Если выражение expr2 отсутствует, это означает, что цикл будет выполняться бесконечно. (PHP неявно воспринимает это значение как true, так же, как в языке C). Это может быть не так бесполезно, как вы могли подумать, так как часто необходимо прервать цикл, используя условный оператор break вместо использования выражения в цикле for, которое принимает истинное значение.
Рассмотрим следующие примеры. Все они отображают числа от 1 до 10:
/* пример 1 */for ($i = 1; $i <= 10; $i++) {
echo $i;
}/* пример 2 */for ($i = 1; ; $i++) {
if ($i > 10) {
break;
}
echo $i;
}/* пример 3 */$i = 1;
for (; ; ) {
if ($i > 10) {
break;
}
echo $i;
$i++;
}/* пример 4 */for ($i = 1, $j = 0; $i <= 10; $j += $i, print $i, $i++);
?>
Конечно, первый пример кажется самым хорошим (или, возможно, четвёртый), но вы можете обнаружить, что возможность использовать пустые выражения в циклах for может стать удобной во многих случаях.
PHP также поддерживает альтернативный синтаксис с двоеточием для циклов for.
Перебор массивов как показано ниже — это обычное дело для многих пользователей.
/*
* Это массив с некоторыми данными, которые мы хотим изменить
* при работе цикла.
*/
$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():
$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);
}
?>
9 years ago
for($col = ‘R’; $col != ‘AD’; $col++) {
echo $col.’ ‘;
}
returns: R S T U V W X Y Z AA AB AC
Take note that you can’t use $col < ‘AD’. It only works with !=
Very convenient when working with excel columns.
20 years ago
The point about the speed in loops is, that the middle and the last expression are executed EVERY time it loops.
So you should try to take everything that doesn’t change out of the loop.
Often you use a function to check the maximum of times it should loop. Like here:
<?php
for ($i = 0; $i <= somewhat_calcMax(); $i++) {
somewhat_doSomethingWith($i);
}
?>
Faster would be:
<?php
$maxI = somewhat_calcMax();
for ($i = 0; $i <= $maxI; $i++) {
somewhat_doSomethingWith($i);
}
?>
And here a little trick:
<?php
$maxI = somewhat_calcMax();
for ($i = 0; $i <= $maxI; somewhat_doSomethingWith($i++)) ;
?>
The $i gets changed after the copy for the function (post-increment).
7 years ago
<?php
for ($date = strtotime(«2014-01-01»); $date < strtotime(«2014-02-01»); $date = strtotime(«+1 day», $date)) {
echo date(«Y-m-d», $date).«<br />»;
}
?>
7 years ago
<?php
for ($i = 0; $i < calculateLoopLength(); $i++) {
doSomethingWith($i);
}
>?
As
other comments have pointed out, if «calculateLoopLength» will keep giving back the same value, it can be moved outside the loop:<?
php$loopLength = calculateLoopLength();
for ($i=0; $i < $loopLength; $i++) {
doSomethingWith($i);
}
?>
However, if the order the looping doesn’t matter (ie. each iteration is independent) then we don’t need to use an extra variable either, we can just count down (ie. loop ‘backwards’) instead:
<?php
for ($i=calculateLoopLength(); $i > 0; $i—) {
doSomething($i);
}
?>
In fact, we can simplify this even more, since «$i > 0» is equivalent to «$i» (due to type casting):
<?php
for ($i=calculateLoopLength(); $i; $i—) {
doSomething($i);
}
?>
Finally, we can switch to a ‘pre-decrement’ instead of a ‘post-decrement’ to be slightly more efficient (see, for example, http://dfox.me/2011/04/php-most-common-mistakes-part-2-using-post-increment-instead-of-pre-increment/ ):
<?php
for ($i = calculateLoopLength(); $i; —$i) {
doSomething($i);
}
?>
In this case we could also replace the entire loop with a map, which might make your algorithm clearer (although this won’t work if calculateLoopLength() == 0):
<?php
array_map(‘doSomething’,
range(0, calculateLoopLength() — 1));
?>
3 years ago
for ($i=$reverse?($N-1):0; $reverse?($i>-1):($i<$N); $reverse?$i—:$i++) {
… your code here
}
(Using PHP 5.4.45)
4 years ago
This note should might be under the «strlen» manual page, but there is a better chance for more paying attention here (nevertheless I have made a short note over there allso).
A loop function that test for the string length at each iteration takes forever (possibly due to «strlen» searches for the C-style string terminator — a binary 0 — every time..
So loops like this, using «strlen» in the for…
for ($i = 0; $i < strlen($crc); $i++) …..
Will benefit tremendously in speed by a short step that saves the string length once and use that in the loop.
$clen = strlen($crc);
for ($i = 0; $i < $clen ; $i++) …..
Note: as a real hard-core programmer You are aware, that this is only valid if you don’t change the string content inside the loop (and hereby allso the length). If the change is only occationly , You could just refresh the length variable or else just live with a quite slow loop.
This «discovery» was made from using an example of 16 bit crc calculation over at the «crc32» function manual page, that do exactly that..
7 years ago
<?php
$array
= array(‘pop0’,
‘pop1’,
‘pop2’,
‘pop3’,
‘pop4’,
‘pop5’,
‘pop6’,
‘pop7’,
‘pop8’
);
echo «Tot Before: «.count($array).«<br><br>»;
for ($i=0; $i<count($array); $i++) {
if ($i === 3) {
unset($array[$i]);
}
echo «Count: «.count($array). » — Position: «.$i.«<br>»;
}
echo «<br> Tot After: «.count($array).«<br>»;?>
The result is:
—
Tot Before: 9
Count: 9 — Position: 0
Count: 9 — Position: 1
Count: 9 — Position: 2
Count: 8 — Position: 3
Count: 8 — Position: 4
Count: 8 — Position: 5
Count: 8 — Position: 6
Count: 8 — Position: 7
Tot After: 8
—
The position 8 is skipped, because the «expr2» {{ $i<count($array) }} is evaluated again, for each cycle.
The solution is:
<?php
$array = array(
‘pop0’,
‘pop1’,
‘pop2’,
‘pop3’,
‘pop4’,
‘pop5’,
‘pop6’,
‘pop7’,
‘pop8’
);
echo «Tot Before: «.count($array).«<br><br>»;
$count = count($array);
for ($i=0; $i<$count; $i++) {
if ($i === 3) {
unset($array[$i]);
}
echo «Count: «.count($array). » — Position: «.$i.«<br>»;
}
echo «<br> Tot After: «.count($array).«<br>»;
?>
1 year ago
If you want to do a for and increment with decimal numbers:
<?php
for($i=0; $i<=2; $i+=0.1)
echo $i;
?>
The code will never show 2 as expected, because of decimal imprecision if I remember well.
You will need to round:
<?php
for($i=0; round($i,1)<=2; $i+=0.1)
echo $i.«,»;
?>
This code correctly shows 0,0.1 …. 2.
6 years ago
<?php For( $a = 0; $a < 10; $a++ ) { ?>
//Random html elements you would like to duplicate.
<?php } ?>
Then yes you can. It works like a charm.
8 years ago
<?php
$array
= array(0 => «a», 1 => «b», 2 => «c», 3 => «d»);for(
$i = 0; $i < count($array); $i++){echo
$array[$i];unset(
$array[$i]);}
?>This will only output the half of the elements, because the array is becoming shorter everytime the for-expression counts it.
17 years ago
Also acceptable:
<?php
for($letter = ord(‘a’); $letter <= ord(‘z’); $letter++)
print chr($letter);
?>
15 years ago
<?php
for($i = 0, $x = $nums[‘x_val’], $n = 15; ($i < 23 && $number != 24); $i++, $x + 5 {
}
?>
14 years ago
On the combination problem again…
It seems to me like it would make more sense to go through systematically. That would take nested for loops, where each number was put through all of it’s potentials sequentially.
The following would give you all of the potential combinations of a four-digit decimal combination, printed in a comma delimited format:
<?php
for($a=0;$a<10;$a++){
for($b=0;$b<10;$b++){
for($c=0;$c<10;$c++){
for($d=0;$d<10;$d++){
echo $a.$b.$c.$d.«, «;
}
}
}
}
?>
Of course, if you know that the numbers you had used were in a smaller subset, you could just plunk your possible numbers into arrays $a, $b, $c, and $d and then do nested foreach loops as above.
— Elizabeth
3 years ago
$reverse = TRUE; //iteration direction switch
for ($i=$reverse?($N-1):0; $reverse?($i>-1):($i<$N); $reverse?$i—:$i++) {
… your code here
}
(Using PHP 5.4.45)
3 months ago
<?php
for ($x = 0; $x <= 100; $x+=10) {
echo «The number is: $x <br>»;
}
?>
5 years ago
when iterating a multidimentional array like this:
for ($i = 0; $i < $size_x; $i++) {
for ($j = 0; $j < $size_y; $j++) {
do_something($a[$i][$j]);
}
}
it is faster to use $a[$i][$j] than using $a[$j][$i]
for ($i = 0; $i < $size_x; $i++) {
for ($j = 0; $j < $size_y; $j++) {
do_something($a[$j][$i]);
}
}
if you know about how RAM works you understand why
3 years ago
You should test it out.
<!DOCTYPE html>
<html>
<body>
<?php
$letter = array();
for ($letters = ‘A’; $letters != ‘AA’; $letters++)
{
array_push($letter, $letters);
}
echo ‘<pre>’ . var_export($letter, true) . ‘</pre>’;
?>
</body>
</html>
17 years ago
If you’re already using the fastest algorithms you can find (on the order of O(1), O(n), or O(n log n)), and you’re still worried about loop speed, unroll your loops using e.g., Duff’s Device:
<?php
$n = $ITERATIONS % 8;
while ($n—) $val++;
$n = (int)($ITERATIONS / 8);
while ($n—) {
$val++;
$val++;
$val++;
$val++;
$val++;
$val++;
$val++;
$val++;
}
?>
(This is a modified form of Duff’s original device, because PHP doesn’t understand the original’s egregious syntax.)
That’s algorithmically equivalent to the common form:
<?php
for ($i = 0; $i < $ITERATIONS; $i++) {
$val++;
}
?>
$val++ can be whatever operation you need to perform ITERATIONS number of times.
On my box, with no users, average run time across 100 samples with ITERATIONS = 10000000 (10 million) is:
Duff version: 7.9857 s
Obvious version: 27.608 s
11 years ago
<?php
$text
=«Welcome to PHP»;$searchchar=«e»;
$count=«0»; for($i=«0»; $i<strlen($text); $i=$i+1){
if(substr($text,$i,1)==$searchchar){
$count=$count+1;
}
}
echo
$count?>
this will be count how many «e» characters in that text (Welcome to PHP)6 years ago
<?phpfor ($names = array(); count($names) < 12; $names = array_unique($names)) {
$names[] = $faker->word(2);
}print_r($names);
?>
will print something like:
Array
(
[0] => cc
[1] => cb
[2] => dd
[3] => db
[4] => bb
[6] => cd
[8] => aa
[9] => ad
[10] => ca
[11] => ac
[12] => dc
[15] => ab
)
3 years ago
<!DOCTYPE html>
<html>
<body>
<?php
$letter = array();
for ($letters = ‘A’; $letters != ‘AA’; $letters++)
{
array_push($letter, $letters);
}
echo ‘<pre>’ . var_export($letter, true) . ‘</pre>’;
?>
</body>
</html>
Источник: http://php.net/manual/ru/control-structures.for.php
Цикл for
Синтаксис цикла for выглядит следующим образом:
Данный цикл состоит из ключевого слова for, за которым следуют круглые скобки, содержащие внутри три выражения, разделенных точками с запятой. Он имеет следующий порядок выполнения:
- В начале цикла выполняется инициализирующее выражение, оно всегда вычисляется (выполняется) только один раз в самом начале.
- Далее следует условное выражение. Перед началом каждой итерации вычисляется значение условного выражения (условие выполнения), если оно принимает значение TRUE, то тело цикла выполняется, если оно принимает значение FALSE, выполнение цикла завершается. Если при первой проверке условие оказывается ложным, тело цикла не выполнится ни разу.
- В самом конце, после выполнения действий в теле цикла обрабатывается последнее выражение (следующее выражение после условия). В данном случае это инкрементирующее выражение — оно увеличивает с помощью инкремента значение переменной-счетчика.
Простой пример цикла for:
<?php for ($k = 1; $k <= 10; $k++) { echo «$k «; } ?>
На самом деле цикл for является почти универсальным, поскольку он допускает самые разные варианты своего применения.
Источник: http://puzzleweb.ru/php/19_loops2.php
PHP-МАСТЕР.
От теории до собственной CMS интернет-магазина
Подробнее
Бесплатный курс по PHP программированию
Подробнее
Источник: http://webformyself.com/php-operatory-ciklov/
Задание
Реализуйте функцию sumOfSeries(), которая считает сумму ряда целых чисел. Ряд задаётся двумя числами — начальным и конечным.
Функция принимает два аргумента-числа и возвращает сумму ряда. Например, для аргументов 4 и 7 сумма будет 4 + 5 + 6 + 7 = 22.
<?phpsumOfSeries(1, 2); // 3sumOfSeries(1, 3); // 6sumOfSeries(4, 7); // 22
Если начальное и конечное числа равны, то результатом будет то же число:
<?phpsumOfSeries(1, 1); // 1
Нашли ошибку? Есть что добавить? Пулреквесты приветствуются
https://github.com/hexlet-basics
Источник: http://ru.code-basics.com/languages/php/lessons/for
Разница между DURING и FOR
Предлог during используется в ситуациях, когда одно действие произошло во время какого-то другого события. Он так и переводится на русский язык – «в течение, во время». После during мы ставим существительное, которое обозначает какое-то событие, какой-то специфический промежуток времени. Давайте рассмотрим на примерах:
I ate two buckets of popcorn during the movie session.
Я съел два ведерка попкорна за время сеанса кино.
During the winter I always gain a couple of extra pounds.
В течение зимы я всегда набираю пару лишних килограммов.
Предлог for также значит «в течение» чего-либо. Но с помощью него мы делаем акцент на том, как долго длилось действие. После for обычно указывается промежуток времени, который можно измерить (минуты, часы, дни, недели, сезоны, года и т.п.). Сравните с примерами:
My sister has been learning to play drums for three years.
Моя сестра учится играть на барабанах в течение трех лет.
Alice will be in the mountains for a month.
Элис будет в горах в течение месяца.
Главное для предлога for – сколько по времени длилось действие
Разница между during и for заключается в том, что, когда мы используем during, нам важно только то, когда именно произошло событие. Мы говорим, что во время какого-то события случилось еще какое-то действие, и это действие необязательно занимало весь этот период.
Но когда мы используем for, нам важно то, как долго длилось действие. С предлогом for мы имеем в виду, что действие длилось весь указанный промежуток времени. Давайте с помощью схожих примеров разберемся, в чем конкретно выражается разница между ними.
They went to Moscow during the summer.
Они ездили в Москву в течение лета. (Имеется ввиду один раз за все лето.)
They went to Moscow for the summer.
Они ездили в Москву на лето. (Все лето провели в Москве.)
Источник: http://willspeak.ru/blog/for-during-while-raznica/
Python для цикла
Цикл for используется для повторения определенных строк кода в программе. Предположим, вы хотите напечатать числа до 10, вы можете сделать это, набрав 10 операторов печати или используя цикл for. Цикл for повторяет часть программы на основе последовательности.
цикл for повторяет тело цикла для каждого элемента в заданной последовательности. Как только все элементы выполнены, цикл завершается, и управление выходит из своего блока.
Синтаксис
for Counter in Variable:
statement 1
statement 2
statement n
Источник изображения
пример
a={1,2,3,4,5}
for i in a:
print i
Выход
Здесь переменная «а» определена с 5 значениями. Цикл for здесь не проверяет никаких условий, как в случае цикла while. Он просто следует за последовательностью переменной. Мы также объявили переменную счетчика «i», которая выполняет итерацию по всему циклу. ‘in’ — это ключевое слово, используемое для указания интерпретатора для циклического перебора переменной ‘a’. Двоеточие необходимо, чтобы сообщить интерпретатору Python, что блок цикла for начинается со следующей строки.
Примечание. Отступы необходимы, поскольку они помогают интерпретатору идентифицировать тело цикла for.
Источник: http://zen.yandex.ru/media/id/5eba7f439f339d116671be06/cikly-for-i-while-5fbb37c79d2ffe38eea6b5e7
Инструкция continue
Существует также инструкция continue, при достижении которой цикл начинает новую итерацию. Иногда может быть полезна для упрощения кода, хотя практически всегда задачу можно решить и без нее.
Источник: http://old.code.mu/books/php/base/rabota-s-ciklami-foreach-for-while-v-php.html
Вложенные циклы
Так же как и условные операторы, циклы могут быть вложенными. Простой пример с одним уровнем вложенности:
<?php for ($i = 0; $i < 4; $i++) { echo «Внешний цикл.<br>»; for ($j = 0; $j < 2; $j++) { echo «Вложенный цикл.<br>»; } } ?>
Источник: http://puzzleweb.ru/php/19_loops2.php
Что вам делать дальше:
Приступайте к решению задач по следующей ссылке: задачи к уроку.
Когда все решите — переходите к изучению новой темы.
Источник: http://old.code.mu/books/php/base/rabota-s-ciklami-foreach-for-while-v-php.html
Конструкция goto
goto — оператор безусловного перехода. При упоминании goto и
названия метки
идёт поиск самой метки, куда нужно перейти. Сама метка ставится после оператора и имеет вид
название:
.
Синтаксис
goto название_метки; // указываем желаемую метку
echo ‘hello’;
название_метки: // место перехода
echo ‘world’;
Пример goto
<?php
$a = 0;
for ($a = 0; $a < 10; $a++) {
if ($a == 5) // если значение переменной $a равно 5
goto end; // то переходим к выполнению инструкций следующих за меткой
echo «$a»;
}
echo ‘после цикла — до метки’; // инструкция не будет выполнена
end:
echo ‘После метки’;
?>
Демонстрация Скачать исходники
Спасибо за внимание и удачи в изучении php!
Источник: http://tradebenefit.ru/cikly-v-php