Цикл while в php

Цикл while в php

На втором месте по частоте использования, после конструкций условий (условных операторов), находятся .

Циклы позволяют повторять определенное (и даже неопределенное — когда работа цикла зависит от условия) колличество раз различные операторы. Данные операторы называются . Проход цикла называется .

PHP поддерживает три вида циклов:

  • Цикл с предусловием (while);
  • Цикл с постусловием (do-while);
  • Цикл со счетчиком (for);
  • Специальный цикл перебора массивов (foreach).

При использовании циклов есть возможность использования операторов break и continue. Первый из них прерывает работу всего цикла, а второй — только текущей итерации.

Рассмотрим циклы PHP:

Цикл с предусловием while

Цикл с предусловием while работает по следующим принципам:

  1. Вычисляется значение логического выражения.
  2. Если значение истинно, выполняется тело цикла, в противном случае — переходим на следующий за циклом оператор.

Синтаксис цикла с предусловием:

while (логическое_выражение)
инструкция;

В данном случае телом цикла является . Обычно тело цикла состоит из большого числа операторов. Приведем пример цикла с предусловием while:

php
$ x = 0 ;
while ($ x ++ 10 ) echo $ x ;
// Выводит 12345678910
?>

Обратите внимание на последовательность выполнения операций условия $x++ php
$ x = 0 ;
while ($ x 10 )
<
$ x ++; // Увеличение счетчика
echo $ x ;
>
// Выводит 12345678910
?>

Если мы увеличим счетчик после выполнения оператора echo, мы получим строку 0123456789. В любом случае, мы имеем 10 итераций. Итерация — это выполение операторов внутри тела цикла.

Подобно конструкции условного оператора if, можно группировать операторы внутри тела цикла while, используя следующий альтернативный синтаксис:

while ( логическое_выражение ):
инструкция;
.
endwhile;

= 1 ;
while ( $x 10 ):
echo $x ;
$x ++;
endwhile;
?>

Цикл с постусловием do while

В отличие от цикла while, этот цикл проверяет значение выражения не , а каждого прохода (итерации). Таким образом, тело цикла выполняется хотя бы один раз. Синтаксис цикла с постусловием такой:

do
<
тело_цикла;
>
while (логическое_выражение);

После очередной итерации проверяется, истинно ли логическое_выражение, и, если это так, управление передается вновь на начало цикла, в противном случае цикл обрывается.
Альтернативного синтаксиса для do-while разработчики PHP не предусмотрели (видимо, из-за того, что, в отличие от прикладного программирования, этот цикл довольно редко используется при программировании web-приложений).

Пример скрипта, показывающего работу цикла с постусловием do-while:

Рассмотренный сценарий выводит: 12345678910

Цикл со счетчиком for

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

Синтаксис цикла for такой:

for (инициализирующие_команды; условие_цикла; команды_после_итерации)

Цикл for начинает свою работу с выполнения инициализирующих_команд. Данные команды выполняются только один раз. После этого проверяется условие_цикла, если оно истинно (true), то выполняется тело_цикла. После того, как будет выполнен последний оператор тела, выполняются команды_после_итерации. Затем снова проверяется условие_цикла. Если оно истинно (true), выполняется тело_цикла и команды_после_итерации, и.т.д.

php
for ($ x = 0 ; $ x 10 ; $ x ++) echo $ x ;
?>

Данный сценарий выводит: 0123456789

Есть вариант вывода строки 12345678910 :

php
for ($ x = 0 ; $ x ++ 10 😉 echo $ x ;
// Выводит 12345678910
?>

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

Если необходимо указать несколько команд, их можно разделить запятыми, пример:

php
for ($ x = 0 , $ y = 0 ; $ x 10 ; $ x ++, $ y ++) echo $ x ;
// Выводит 0123456789
?>

Приведем еще один, более практичный пример использования нескольких команд в цикле for:

php
for($ i = 0 ,$ j = 0 ,$ k = "Точки" ; $ i 10 ; $ j ++,$ i +=$ j ) < $ k =$ k . "." ; echo $ k ; >
// Выводит Точки.Точки..Точки. Точки.
?>

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

Для цикла for имеется и альтернативный синтаксис:

for(инициализирующие_команды; условие_цикла; команды_после_итерации):
операторы;
endfor;

Цикл перебора массивов foreach

В PHP4 появился еще один специальный тип цикла — foreach. Данный цикл предназначен специально для .

Синтаксис цикла foreach выглядит следующим образом:

foreach (массив as $ключ=>$значение)
команды;

Здесь команды циклически выполняются для каждого элемента массива, при этом очередная пара ключ=>значение оказывается в переменных $ключ и $значение. Приведем пример работы цикла foreach:

Читайте также:  Двб т2 антенна своими руками из кабеля

php
$ names [ "Иванов" ] = "Андрей" ;
$ names [ "Петров" ] = "Борис" ;
$ names [ "Волков" ] = "Сергей" ;
$ names [ "Макаров" ] = "Федор" ;
foreach ($ names as $ key => $ value ) <
echo "$value $key
" ;
>
?>

Рассмотренный сценарий выводит:

Андрей Иванов
Борис Петров
Сергей Волков
Федор Макаров

У цикла foreach имеется и другая форма записи, которую следует применять, когда нас не интересует значение ключа очередного элемента. Выглядит она так:

foreach (массив as $значение)
команды;

В этом случае доступно лишь очередного элемента массива, но не его ключ. Это может быть полезно, например, для работы с массивами-списками:

php
$ names [] = "Андрей" ;
$ names [] = "Борис" ;
$ names [] = "Сергей" ;
$ names [] = "Федор" ;
foreach ($ names as $ value ) <
echo "$value
" ;
>
?>

Внимание: Цикл foreach оперирует не исходным массивом, а его копией. Это означает, что любые изменения, которые вносятся в массив, не могут быть "видны" из тела цикла. Что позволяет, например, в качестве массива использовать не только переменную, но и результат работы какой-нибудь функции, возвращающей массив (в этом случае функция будет вызвана всего один раз — до начала цикла, а затем работа будет производиться с копией возвращенного значения).

Конструкция break

Очень часто для того, чтобы упростить логику какого-нибудь сложного цикла, удобно иметь возможность его прервать в ходе очередной итерации (к примеру, при выполнении какого-нибудь особенного условия). Для этого и существует конструкция break, которая осуществляет немедленный выход из цикла. Она может задаваться с одним необязательным параметром — числом, которое указывает, из какого вложенного цикла должен быть произведен выход. По умолчанию используется 1, т. е. выход из текущего цикла, но иногда применяются и другие значения. Синтаксис конструкции break:

break; // По умолчанию
break(номер_цикла); // Для вложенных циклов (указывается номер прерываемого цикла)

php
$ x = 0 ;
while ($ x ++ 10 ) <
if ($ x == 3 ) break;
echo "Итерация $x
" ;
>
// Когда $x равен 3, цикл прерывается
?>

Рассмотренный сценарий выводит:

Если нам нужно прервать работу определенного (вложенного) цикла, то нужно передать конструкции break параметр — номер_цикла, например, break(1). Нумерация циклов выглядит следующим образом:

for (. ) // Третий цикл
<
for (. ) // Второй цикл
<
for (. ) // Первый цикл
<
>
>
>

Конструкция continue

Конструкция continue так же, как и break, работает только "в паре" с циклическими конструкциями. Она немедленно завершает текущую итерацию цикла и переходит к новой (конечно, если выполняется условие цикла для цикла с предусловием). Точно так же, как и для break, для continue можно указать уровень вложенности цикла, который будет продолжен по возврату управления.
В основном continue позволяет вам сэкономить количество фигурных скобок в коде и увеличить его удобочитаемость. Это чаще всего бывает нужно в циклах-фильтрах, когда требуется перебрать некоторое количество объектов и выбрать из них только те, которые удовлетворяют определенным условиям. Приведем пример использования конструкции continue:

php
$ x = 0 ;
while ($ x ++ 5 ) <
if ($ x == 3 ) continue;
echo "Итерация $x
" ;
>
// Цикл прервется только на третьей итерации
?>

Рассмотренный скрипт выводит:

Итерация 1
Итерация 2
Итерация 4
Итерация 5

Грамотное использование break и continue позволяет заметно улучшить "читабельность" кода и количество блоков else.

Цикл WHILE, вместо использования счетчика цикла проверяет некоторое условие до того, пока это условие Истина (TRUE). Синтаксис:

Условие проверяется перед выполнением цикла, если оно будет Ложным в начале, то цикл не выполнится ни разу!
В теле цикла должна быть переменная которая будет оказывать влияние на условие, чтобы предотвратить зацикливание. Пример:

Отображение в браузере:

После вывода строки, переменная $counter увеличивается на 1, и когда она станет больше или равна 5, то цикл завершится.

(PHP 4, PHP 5, PHP 7)

Циклы while являются простейшим видом циклов в PHP. Они ведут себя так же, как и в языке C. Простейшей формой цикла while является следующее выражение:

Читайте также:  Http www pendrivelinux com

Смысл выражения while очень прост. Оно указывает PHP выполнять вложенные выражения повторно до тех пор, пока выражение в самом while является TRUE . Значение выражения expr проверяется каждый раз перед началом цикла, поэтому даже если значение выражения изменится в процессе выполнения вложенных выражений в цикле, выполнение не прекратится до конца итерации (каждый раз, когда PHP выполняет выражения в цикле — это одна итерация). В том случае, если выражение while равно FALSE с самого начала, вложенные выражения ни разу не будут выполнены.

Также, как и с оператором if, вы можете группировать несколько выражений внутри одного цикла while, заключая эти выражения между фигурными скобками или используя альтернативный синтаксис:

Следующие примеры идентичны, и оба выведут числа от 1 до 10:

$i = 1 ;
while ( $i 10 ) <
echo $i ++; /* выводиться будет значение переменной
$i перед её увеличением
(post-increment) */
>

$i = 1 ;
while ( $i 10 ):
echo $i ;
$i ++;
endwhile;
?>

User Contributed Notes 20 notes

Just a note about using the continue statement to forego the remainder of a loop — be SURE you’re not issuing the continue statement from within a SWITCH case — doing so will not continue the while loop, but rather the switch statement itself.

While that may seem obvious to some, it took a little bit of testing for me, so hopefully this helps someone else.

Is strange that the manual states.
"Sometimes, if the while expression evaluates to FALSE from the very beginning, the nested statement(s) won’t even be run once. "

Because it can’t be SOMETIMES

If it behaves that way, then it is a bug, because it ALWAYS must not run the nested statement(s) even once if the WHILE expression evaluates to FALSE from the very beginning.

Another way to exit the while loop is by using the BREAK statement.. see it in the manual.

And if expression evaluates to NULL is the same as FALSE
while (expression evals to NULL)

Just a note to stuart — the reason for this behaviour is because using the while(value = each(array)) construct increments the internal counter of the array as its looped through. Therefore if you intend to repeat the loop, you need to reset the counter. eg:

$one = array("10", "20", "30", "40");
$two = array("a", "b", "c", "d");

While can do wonders if you need something to queue writing to a file while something else has access to it.

Here is my simple example:

function write ( $data , $file , $write_mode = "w" ) <
$lock = $file . ".lock" ;
// run the write fix, to stop any clashes that may occur
write_fix ( $lock );
// create a new lock file after write_fix() for this writing session
touch ( $lock );
// write to your file
$open = fopen ( $file , $write_mode );
fwrite ( $open , $data );
fclose ( $open );
// kill your current lock
unlink ( $lock );
>

function write_fix ( $lock_file ) <
while( file_exists ( $lock_file ) <
// do something in here?
// maybe sleep for a few microseconds
// to maintain stability, if this is going to
// take a while ?? [just a suggestion]
>
>

?>

This method is not recommended for use with programs that will be needing a good few seconds to write to a file, as the while function will eat up alot of process cycles. However, this method does work, and is easy to implement. It also groups the writing functions into one easy to use function, making life easier. 🙂

At the end of the while (list / each) loop the array pointer will be at the end.
This means the second while loop on that array will be skipped!

You can put the array pointer back with the reset($myArray) function.

=array( ‘aa’ , ‘bb’ , ‘cc’ , ‘dd’ );
while (list ( $key , $val ) = each ( $myArray ) ) echo $val ;
reset ( $myArray );
while (list ( $key , $val ) = each ( $myArray ) ) echo $val ;
?>

Читайте также:  Запаять полотенцесушитель из нержавейки

Instead of this usage;

= array( "orange" , "banana" , "apple" , "raspberry" );

$i = 0 ;
while ( $i count ( $arr )) <
$a = $arr [ $i ];
echo $a . "
" ;
$i ++;
>
// or
$i = 0 ;
$c = count ( $arr );
while ( $i $c ) <
$a = $arr [ $i ];
echo $a . "
" ;
$i ++;
>
?>

This could be more efficient;

while ( $a = $arr [ 1 * $i ++]) echo $a . "
" ;
?>

= 50 ; // number of loops

the variable can
be modified: $i

while(! $i == 0 ) <
DoAnyFunction ();
>

I made a test traversing an array (simple, but long, numeric array with numeric keys). My test had a cycle per method, and multiplied each array element by 100.. These were my results:

[test_time] [BEGINS/RESETS @ time_start = 1060977996.689]
0.2373 seg later -> while (list ($key, $val) = each ($array)) ENDS

[test_time] [BEGINS/RESETS @ time_start = 1060977996.9414]
0.1916 seg later -> while (list ($key,) = each ($array)) ENDS

[test_time] [BEGINS/RESETS @ time_start = 1060977997.1513]
0.1714 seg later -> foreach ($array AS $key=>$value) ENDS

[test_time] [BEGINS/RESETS @ time_start = 1060977997.3378]
0.0255 seg later -> while ($next = next($array)) ENDS

[test_time] [BEGINS/RESETS @ time_start = 1060977997.3771]
0.1735 seg later -> foreach ($array AS $value) ENDS
**************************************************************

foreach is fatser than a while (list — each), true.
However, a while(next) was faster than foreach.

These were the winning codes:

$array = $save;
test_time("",1);
foreach ($array AS $key=>$value)
$array[$key] = $array[$key] * 100;
test_time("foreach ($array AS $key=>$value)");

$array = $save;
test_time("",1);
reset($array);
while ($next = next($array))
< $key = key($array);
$array[$key] = $array[$key] * 100;
>
test_time("while ($next = next($array))");
*********************************************************
The improvement seems huge, but it isnt that dramatic in real practice. Results varied. I have a very long bidimensional array, and saw no more than a 2 sec diference, but on 140+ second scripts. Notice though that you lose control of the $key value (unless you have numeric keys, which I tend to avoid), but it is not always necessary.

I generally stick to foreach. However, this time, I was getting Allowed Memory Size Exceeded errors with Apache. Remember foreach copies the original array, so this now makes two huge 2D arrays in memory and alot of work for Apache. If you are getting this error, check your loops. Dont use the whole array on a foreach. Instead get the keys and acces the cells directlly. Also, try and use unset and Referencing on the huge arrays.

Working on your array and loops is a much better workaround than saving to temporary tables and unsetting (much slower).

virtualjosh at yahoo dot com (Hosh) wrote on: 16-Aug-2003 12:52

The speedtest is interesting. But the seemingly fastest way contains a pitfall for beginners who just use it because it is fast and fast is cool 😉

Walking through an array with next() will cut of the first entry, as this is the way next() works 😉

If you really need to do it this way, make sure your array contains an empty entry at the beginning. Another way would be to use

while ( $this = current ( $array ) ) <
do_something ( $this );
next ( $array );
>
?>

There is an impact on speed for sure but I did not test it. I would advise to stick with conventional methods because current(),next() in while loops is too error prone for me.

A cool way to keep evaluating something until it fails a test.

while ( true ) <
if ( ‘test’ ) < // is initial condition true
// do something that also changes initial condition
> else < // condition failed
break; // leave loop
>
>
?>

simple pyramid pattern program using while loop
= 1 ;
while( $i 5 )
<
$j = 1 ;
while( $j $i )
<
echo "*&nbsp&nbsp" ;
$j ++;
>
echo "
" ;
$i ++;
>
?>
// or alternatively you can use:
= 1 ;
while( $i 5 ):

Ссылка на основную публикацию
Фум лента в стоматологии фото
Автор: G. Freedman Перевод: Александр Зыбайло Автор: G. Freedman Перевод: Александр Зыбайло Ограничение количества цемента для фиксации и использование определенной...
Усики для автомобильной антенны
Убираясь в бардачке я наткнулся на ремкомплект антенных усиков — лежит наверно уже полгода, всё наклеить не могу, то забываю,...
Усиление сигнала интернета на даче своими руками
С наступление дачного сезона, я озадачился установкой хорошего скоростного интернет на даче, у нас голосовая связь работает без проблем, а...
Функции жесткого диска в компьютере
Жесткий диск, он же винчестер, является основным местом, где хранится вся информация. В отличие от оперативной памяти, он энергетически независим,...
Adblock detector