Можете ли вы «выйти» из цикла в PHP?


118

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

foreach($results as $result) {
    if (!$condition) {
        $halt = true;
        ErrorHandler::addErrorToStack('Unexpected result.');
    }

    doSomething();
 }

if (!$halt) {
    // do what I want cos I know there was no error
}

Это все работает хорошо, но все еще проходит, несмотря на то, что после одной ошибки в этом нет необходимости. Есть ли способ выйти из цикла?

Ответы:


211

Вы ищете оператор break .

$arr = array('one', 'two', 'three', 'four', 'stop', 'five');
while (list(, $val) = each($arr)) {
    if ($val == 'stop') {
        break;    /* You could also write 'break 1;' here. */
    }
    echo "$val<br />\n";
}

13
@Gabriel, он отвечает на вопрос, образец кода именно такой, образец. Вы также можете пожаловаться на не описательное имя массива "$ arr".
paxdiablo

5
@Gabriel: Я публикую код, на который есть прямая ссылка в руководстве по PHP, и он точно показывает использование оператора break.
TheTXI

@Pax, для меня это субъективно, каждый раз, когда я приводил пример, я пытался ввести реальный код.
Габриэль Соса,

1
@Gabriel: Вы вообще не публиковали пример, и ссылка, которую вы дали, ведет к тому же источнику, который я предоставил (откуда пример кода находится в самом верху). По сути, вы сделали то же самое, что и я, но сделали так, чтобы оператор не видел образец до тех пор, пока не щелкнет ссылку.
TheTXI,

3
То есть странный способ петли однако!
Алекс

151

Как указано в других сообщениях, вы можете использовать ключевое слово break. Одна вещь, на которую намекали, но не объясняли, - это то, что ключевое слово может принимать числовое значение, чтобы сообщить PHP, из скольких уровней нужно выйти.

Например, если у вас есть три вложенных друг в друга цикла foreach, пытающихся найти часть информации, вы можете выполнить команду «break 3», чтобы выйти из всех трех вложенных циклов. Это будет работать для структур «for», «foreach», «while», «do-while» или «switch».

$person = "Rasmus Lerdorf";
$found = false;

foreach($organization as $oKey=>$department)
{
   foreach($department as $dKey=>$group)
   {
      foreach($group as $gKey=>$employee)
      {
         if ($employee['fullname'] == $person)
         {
            $found = true;
            break 3;
         }
      } // group
   } // department
} // organization

5
Хорошая точка зрения. Это довольно ясно объясняется в руководстве по PHP вверху. Я не думаю, что это было обязательно для этого конкретного вопроса, но это все же очень хорошо знать. +1
TheTXI

46

break; оставляет вашу петлю.

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


именно то, что мне было нужно ... это "continue" для разрыва только текущего цикла, а не выхода из всего цикла, как это делает break.
К. Килиан Линдберг


4

Все это хорошие ответы, но я хотел бы предложить еще один, который, как мне кажется, является лучшим стандартом кода. Вы можете использовать флаг в условии цикла, который указывает, следует ли продолжать цикл и избегать использования breakвсех вместе.

$arr = array('one', 'two', 'three', 'four', 'stop', 'five');
$length = count($arr);
$found = false;
for ($i = 0; $i < $length && !$found; $i++) {
    $val = $arr[$i];
    if ($val == 'stop') {
        $found = true; // this will cause the code to 
                       // stop looping the next time 
                       // the condition is checked
    }
    echo "$val<br />\n";
}

Я считаю, что это лучшая практика кода, потому что она не зависит от breakиспользуемой области. Скорее, вы определяете переменную, которая указывает, следует ли прерывать конкретный цикл. Это полезно, когда у вас много циклов, которые могут быть или не быть вложенными или последовательными.


3
$arr = array('one', 'two', 'three', 'four', 'stop', 'five');
foreach ($arr as $val) {
    if ($val == 'stop') {
        break;    /* You could also write 'break 1;' here. */
    }
    echo "$val<br />\n";
}
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.