Чи можете ви вийти з циклу в 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

Ви шукаєте заяву про перерву .

$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, і він точно показує використання заяви перерви.
TheTXI

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

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

3
Те є дивний спосіб петлі однако!
alex

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; пропускає будь-який код, що залишився в цьому циклі, і переходить до наступного циклу, доки умова все ще відповідає дійсності.


саме те, що мені було потрібно .. що "продовжувати", щоб зламати лише поточний цикл і не залишати весь цикл, як робить перерва.
К. Кіліан Ліндберг


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.