Php завершение выполнения цикла

Php завершение выполнения цикла thumbnail
  • break
  • continue
  • goto

break

Часто бывает удобно при возникновении некоторых условий иметь возможность досрочно завершить цикл. Такую возможность предоставляет оператор break. Он работает с такими конструкциями как: while, do while, for, foreach или switch.

Оператор break может принимать необязательный числовой аргумент, который сообщает ему, выполнение какого количества вложенных структур необходимо завершить. Значением числового аргумента по умолчанию является 1, при котором завершается выполнение текущего цикла. Если в цикле используется оператор switch, то break/break 1 выходит только из конструкции switch.

<?php

$j = 0;

while (++$j) {
switch ($j) {
case 5:
echo “Итерация 5<br>n”;
break 1; /* Выход только из конструкции switch. */
case 10:
echo “Итерация 10; выходим<br>n”;
break 2; /* Выход из конструкции switch и из цикла while. */
}
}

// другой пример
for ($bar1 = -4; $bar1 < 7; $bar1++) {
// проверка деления на ноль
if ($bar1 == 0) {
echo ‘Выполнение остановлено: деление на ноль невозможно.’;
break;
}
echo “50/$bar1 = “,50/$bar1,”<br>”;
}

?>

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

continue

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

Оператор continue также как и break может принимать необязательный числовой аргумент, который указывает на скольких уровнях вложенных циклов будет пропущена оставшаяся часть итерации. Значением числового аргумента по умолчанию является 1, при которой пропускается только оставшаяся часть текущего цикла.

<?php

for ($bar1 = -4; $bar1 < 7; $bar1++) {
// проверка деления на ноль
if ($bar1 == 0) {
echo “Итерация пропущена из-за попытки деления на ноль.
“;
continue;
}
echo “50/$bar1 = “,50/$bar1,”<br>”;
}

?>

Обратите внимание: в процессе работы цикла было пропущено нулевое значение переменной $counter, но цикл продолжил работу со следующего значения.

goto

goto является оператором безусловного перехода. Он используется для перехода в другой участок кода программы. Место, куда необходимо перейти в программе указывается с помощью метки (простого идентификатора), за которой ставится двоеточие. Для перехода, после оператора goto ставится желаемая метка.

Простой пример использования оператора goto:

<?php

goto foo; // указываем желаемую метку
echo ‘hello’;

foo: // указываем место куда нужно перейти
echo ‘world’;

?>

Оператор goto имеет некоторые ограничение на использование. Целевая метка должна находиться в том же файле и в том же контексте, это означает, что вы не можете переходить за границы функции или метода, а так же не можете перейти внутрь одной из них. Также нельзя перейти внутрь любого цикла или оператора switch. Но его можно использовать для выхода из этих конструкций (из циклов и оператора switch). Обычно оператор goto используется вместо многоуровневых break.

<?php

for ($numb = 0; $numb < 100; $numb++) {
if ($numb == 5) // если значение переменной $numb == 5
goto end; // переходим к выполнению инструкций следующих за меткой

echo “$numb = $numb
“;
}
echo ‘после цикла – до метки’; // инструкция не будет выполнена

end:
echo ‘После метки’;

?>

Источник

 
 

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

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

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++<10. Сначала проверяется условие, а только потом увеличивается значение переменной. Если мы поставим операцию инкремента перед переменной (++$x<10), то сначала будет выполнено увеличение переменной, а только затем – сравнение. В результате мы получим строку 123456789. Этот же цикл можно было бы записать по-другому:

<?php
$x=0;
while ($x<10)
{
$x++; // Увеличение счетчика
echo $x;
}
// Выводит 12345678910
?>

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

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

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

endwhile;

Пример использования альтернативного синтаксиса:

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

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

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

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

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

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

<?php
$x = 1;
do {
     echo $x;
} while ($x++<10);
?>

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

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

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

Читайте также:  Цикл юпитера 12 лет

Синтаксис цикла 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:

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

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

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

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

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

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

<?php
$names[] = “Андрей”;
$names[] = “Борис”;
$names[] = “Сергей”;
$names[] = “Федор”;
foreach ($names as $value) {
echo “<b>$value</b><br>”;
}
?>

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

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

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

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

Приведем примеры:

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

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

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

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

for (…) // Третий цикл
{
  for (…) // Второй цикл
  {
     for (…) // Первый цикл
     {
     }
  }
}

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

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

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

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

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

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

Источник

continue

(PHP 4, PHP 5, PHP 7, PHP 8)

continue используется внутри циклических структур для
пропуска оставшейся части текущей итерации цикла и, при соблюдении условий,
начала следующей итерации.

Замечание:

В PHP оператор
switch считается
циклическим и внутри него может использоваться continue.
Если continue не передано аргументов, то он ведёт себя
аналогично break, но выдаёт предупреждение о
возможной ошибке. Если switch расположен
внутри цикла, continue 2 продолжит выполнение внешнего
цикла со следующей итерации.

continue принимает необязательный числовой аргумент,
который указывает на скольких уровнях вложенных циклов будет пропущена
оставшаяся часть итерации. Значением по умолчанию является 1,
при которой пропускается оставшаяся часть текущего цикла.

<?php
foreach ($arr as $key => $value) {
    if (!($key % 2)) { // пропуск чётных чисел
        continue;
    }
    do_something_odd($value);
}$i = 0;
while ($i++ < 5) {
    echo “Снаружи<br />n”;
    while (1) {
        echo “В середине<br />n”;
        while (1) {
            echo “Внутри<br />n”;
            continue 3;
        }
        echo “Это никогда не будет выведено.<br />n”;
    }
    echo “Это тоже.<br />n”;
}
?>

Пропуск точки запятой после continue может привести
к путанице. Пример как не надо делать.

<?php
for ($i = 0; $i < 5; ++$i) {
    if ($i == 2)
        continue
    print “$in”;
}
?>

Ожидается, что результат будет такой:

Изменения, касающиеся оператора continue

ВерсияОписание
7.3.0 continue внутри switch,
использующееся как замена break
для switch будет вызывать ошибку
уровня E_WARNING.

jaimthorn at yahoo dot com

10 years ago

The remark “in PHP the switch statement is considered a looping structure for the purposes of continue” near the top of this page threw me off, so I experimented a little using the following code to figure out what the exact semantics of continue inside a switch is:

<?phpfor( $i = 0; $i < 3; ++ $i )
    {
        echo ‘ [‘, $i, ‘] ‘;
        switch( $i )
        {
            case 0: echo ‘zero’; break;
            case 1: echo ‘one’ ; XXXX;
            case 2: echo ‘two’ ; break;
        }
        echo ‘ <‘ , $i, ‘> ‘;
    }?>

Читайте также:  Цикл из значений массива

For XXXX I filled in

– continue 1
– continue 2
– break 1
– break 2

and observed the different results.  This made me come up with the following one-liner that describes the difference between break and continue:

continue resumes execution just before the closing curly bracket ( } ), and break resumes execution just after the closing curly bracket.

Corollary: since a switch is not (really) a looping structure, resuming execution just before a switch’s closing curly bracket has the same effect as using a break statement.  In the case of (for, while, do-while) loops, resuming execution just prior their closing curly brackets means that a new iteration is started –which is of course very unlike the behavior of a break statement.

In the one-liner above I ignored the existence of parameters to break/continue, but the one-liner is also valid when parameters are supplied.

Nikolay Ermolenko

11 years ago

Using continue and break:

<?php

$stack = array(‘first’, ‘second’, ‘third’, ‘fourth’, ‘fifth’);

foreach(

$stack AS $v){

    if($v == ‘second’)continue;

    if($v == ‘fourth’)break;

    echo $v.'<br>’;

}

$stack2 = array(‘one’=>’first’, ‘two’=>’second’, ‘three’=>’third’, ‘four’=>’fourth’, ‘five’=>’fifth’);

foreach($stack2 AS $k=>$v){

    if($v == ‘second’)continue;

    if($k == ‘three’)continue;

    if($v == ‘fifth’)break;

    echo $k.’ ::: ‘.$v.'<br>’;

}

?>

Koen

8 years ago

If you use a incrementing value in your loop, be sure to increment it before calling continue; or you might get an infinite loop.

rjsteinert.com

9 years ago

The most basic example that print “13”, skipping over 2.

<?php
$arr = array(1, 2, 3);
foreach($arr as $number) {
  if($number == 2) {
    continue;
  }
  print $number;
}
?>

www.derosetechnologies.com

16 years ago

In the same way that one can append a number to the end of a break statement to indicate the “loop” level upon which one wishes to ‘break’ , one can append a number to the end of a ‘continue’ statement to acheive the same goal. Here’s a quick example:

<?
    for ($i = 0;$i<3;$i++) {
        echo “Start Of I loopn”;
        for ($j=0;;$j++) {
           
            if ($j >= 2) continue 2; // This “continue” applies to the “$i” loop
            echo “I : $i J : $j”.”n”;
        }
        echo “Endn”;
    }
?>

The output here is:
Start Of I loop
I : 0 J : 0
I : 0 J : 1
Start Of I loop
I : 1 J : 0
I : 1 J : 1
Start Of I loop
I : 2 J : 0
I : 2 J : 1

For more information, see the php manual’s entry for the ‘break’ statement.

tufan dot oezduman at gmail dot com

14 years ago

a possible explanation for the behavior of continue in included scripts mentioned by greg and dedlfix above may be the following line of the “return” documentation: “If the current script file was include()ed or require()ed, then control is passed back to the calling file.”
The example of greg produces an error since page2.php does not contain any loop-operations.

So the only way to give the control back to the loop-operation  in page1.php would be a return.

greg AT laundrymat.tv

16 years ago

You using continue in a file included in a loop will produce an error.  For example:

//page1.php
for($x=0;$x<10;$x++)
   {
    include(‘page2.php’);   
}

//page2.php

if($x==5)
    continue;
else
   print $x;

it should print

“012346789” no five, but it produces an error:

Cannot break/continue 1 level in etc.

Geekman

13 years ago

For clarification, here are some examples of continue used in a while/do-while loop, showing that it has no effect on the conditional evaluation element.

<?php
$i = 0;
while ($i == 0) {
    $i++;
    echo “$i “;
    if ($i == 1) continue;
}$i = 0;
do {
    $i++;
    echo “$i “;
    if ($i == 2) continue;
} while ($i == 1);
?>

Both code snippets would behave exactly the same without continue.

Anonymous

9 years ago

<?php

function print_primes_between($x,$y)

{

    for($i=$x;$i<=$y;$i++)

   {

        for($j= 2; $j < $i; $j++)  if($i%$j==0) continue 2;

        echo $i.”,”;

   }

}

?>

This function, using continue syntax, is to print prime numbers between given numbers, x and y.

For example, print_primes_between(10,20) will output:

11,13,17,19,23,29,

maik penz

8 years ago

Please note that with PHP 5.4 continue 0; will fail with

PHP Fatal error:  ‘continue’ operator accepts only positive numbers

(same is true for break).

John

6 years ago

<?phpecho”n”;
echo”n”;

    for (

$i = 0; $i < 5; $i++ ) {

        switch (

$i)
        {

            case

0:
                echo $i . “b”;
                continue;
                echo $i . “a”;
            case 1:   
                echo $i . “b”;
                continue 2;
                echo $i . “a”;
            case 2:   
                echo $i . “b”;
                break;
                echo $i . “a”;
            case 3:
                echo $i . “b”;
                break 2;
                echo $i . “a”;
            case 4:
                echo $i;
           
        }

Читайте также:  В середине цикла сильные спазмы внизу живота

        echo

9;

    }

echo

“n”;
echo”n”;?>

This results in: 0b91b2b93b

It goes to show that in a switch statement break and continue are the same. But in loops break stops the loop completely and continue just stops executing the current iterations code and moves onto the next loop iteration.

net_navard at yahoo dot com

15 years ago

Hello firends

It is said in manually:
continue also accepts an optional numeric argument which tells it how many levels of enclosing loops it should .

In order to understand better this,An example for that:
<?phpfor($k=0;$k<2;$k++)
{for($j=0;$j<2;$j++)
    {for($i=0;$i<4;$i++)
      {if($i>2)
    continue 2;echo “$in”;
       }

    }

}

?>

Merry’s christmas 🙂
   
With regards,Hossein

send at mail dot 2aj dot net

2 years ago

As of PHP 7.0, instead of code executing up until encountering a continue (or break) call outside of a loop statement, the code will simply not execute.

If you need to correct such error cases as part of an upgrade, you may need to substitute either an exit or return to maintain the existing behavior of such legacy code.

<?phpclass ok {

    function

foo() {
        echo “startn”;

        for (

$i = 0; $i < 5; $i++) {
            echo “beforen”;
            $this->bar($i);
            echo “aftern”;
        }

        echo

“finishn”;
    }

    function

bar($i) {
        echo “inside iteration $in”;
       
        if ($i == 3) {
            echo “continuingn”;
            continue;
        }

        echo

“inside after $in”;
    }
}$ex = new ok();$ex->foo();?>

sh> php56 continue.php
start
before
inside iteration 0
inside after 0
after
before
inside iteration 1
inside after 1
after
before
inside iteration 2
inside after 2
after
before
inside iteration 3
continuing
PHP Fatal error:  Cannot break/continue 1 level in continue.php on line 22
PHP Stack trace:
PHP   1. {main}() continue.php:0
PHP   2. ok->foo() continue.php:31
PHP   3. ok->bar() continue.php:10

sh> php70 continue.php
PHP Fatal error:  ‘continue’ not in the ‘loop’ or ‘switch’ context in continue.php on line 22

Fatal error: ‘continue’ not in the ‘loop’ or ‘switch’ context in continue.php on line 22

dedlfix gives me a hint

15 years ago

a possible solution for
greg AT laundrymat.tv

I’ve got the same problem as Greg
and now it works very fine by using
return() instead of continue.

It seems, that you have to use return()
if you have a file included and
you want to continue with the next loop

Anonymous

12 years ago

The continue keyword can skip division by zero:
<?php
$i = 100;
while ($i > -100)
{
    $i–;
    if ($i == 0)
    {
        continue;
    }
    echo (200 / $i) . “<br />”;
}
?>

szrrya at yahoo dot com

14 years ago

Documentation states:

“continue is used within looping structures to skip the rest of the current loop iteration”

Current functionality treats switch structures as looping in regards to continue.  It has the same effect as break.

The following code is an example:

<?php
for ($i1 = 0; $i1 < 2; $i1++) {
  for ($i2 = 0; $i2 < 2; $i2++) {
    switch ($i2 % 2) {
      case 0:
        continue;
        break;
    }
    print ‘[‘ . $i2 . ‘]<br>’;
  }
  print $i1 . ‘<br>’;
}
?>

This outputs the following:
[0]
[1]

[0]
[1]
1

Switch is documented as a block of if…elseif… statements, so you might expect the following output:
[1]

[1]
1

This output requires you to either change the switch to an if or use the numerical argument and treat the switch as one loop.

Rene

14 years ago

(only) the reason that is given on the “Continue with missing semikolon” example is wrong.

the script will output “2” because the missing semikolon causes that the “print”-call is executed only if the “if” statement is true. It has nothing to to with “what” the “print”-call would return or not return, but the returning value can cause to skip to the end of higher level Loops if any call is used that will return a bigger number than 1.

<?php
continue print “$in”;
?>

because of the optional argument, the script will not run into a “unexpected T_PRINT” error. It will not run into an error, too, if the call after continue does return anything but a number.

i suggest to change it from:
because the return value of the print() call is int(1), and it will look like the optional numeric argument mentioned above.

to
because the print() call will look like the optional numeric argument mentioned above.

Источник