Czy możesz „wyjść” z pętli w PHP?


118

Mam pętlę, która sprawdza błędy w moim kodzie PHP. Pierwotnie wyglądało to mniej więcej tak ...

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
}

Działa to dobrze i dobrze, ale nadal przechodzi przez pętlę, mimo że po jednym błędzie nie musi. Czy jest sposób na wyjście z pętli?

Odpowiedzi:


211

Szukasz oświadczenia o przerwie .

$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, odpowiada na pytanie, przykładowy kod to dokładnie to, próbka. Równie dobrze możesz narzekać na nieopisową nazwę tablicy „$ arr”.
paxdiablo

5
@Gabriel: Publikuję kod, do którego bezpośrednie odniesienia znajdują się w podręczniku PHP, i dokładnie pokazuje on użycie instrukcji break.
TheTXI

@Pax, dla mnie to subiektywne, za każdym razem, gdy podawałem przykład, próbowałem umieścić kod z prawdziwego świata.
Gabriel Sosa

1
@Gabriel: W ogóle nie opublikowałeś przykładu, a link, który podałeś, prowadzi do dokładnie tego samego źródła, które podałem (z którego pochodzi przykładowy kod na samej górze). Zasadniczo zrobiłeś to samo, co ja, ale sprawiłeś, że OP nie zobaczy próbki, dopóki nie kliknie łącza.
TheTXI

3
Że to dziwny sposób na pętli jednak!
Alex

151

Jak stwierdzono w innych postach, możesz użyć słowa kluczowego break. Jedną rzeczą, o której zasugerowano, ale nie wyjaśniono, jest to, że słowo kluczowe może przyjmować wartość liczbową, aby powiedzieć PHP, z ilu poziomów ma wyjść.

Na przykład, jeśli masz trzy pętle foreach zagnieżdżone w sobie, próbując znaleźć jakąś informację, możesz zrobić „break 3”, aby wydostać się ze wszystkich trzech zagnieżdżonych pętli. Będzie to działać dla struktur „for”, „foreach”, „while”, „do-while” lub „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
Słuszna uwaga. Jest to dość jasno wyjaśnione w podręczniku PHP u góry. Nie sądzę, aby było to konieczne w przypadku tego konkretnego pytania, ale nadal dobrze jest wiedzieć. +1
TheTXI

46

break; pozostawia pętlę.

continue; pomija dowolny kod do końca tej pętli i przechodzi do następnej pętli, o ile warunek jest nadal prawdziwy.


tylko to, czego potrzebowałem ... to „kontynuuj” do przerywania tylko bieżącej pętli i nie pozostawiania całej pętli tak, jak robi to break.
K. Kilian Lindberg,


4

Wszystkie te odpowiedzi są dobre, ale chciałbym zasugerować jeszcze jedną, która moim zdaniem jest lepszym standardem kodu. Możesz zdecydować się na użycie flagi w warunku pętli, która wskazuje, czy kontynuować pętlę i unikać używania breakwszystkiego razem.

$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";
}

Uważam, że jest to lepsza praktyka kodowania, ponieważ nie zależy od breakużywanego zakresu . Zamiast tego definiujesz zmienną, która wskazuje, czy przerwać określoną pętlę. Jest to przydatne, gdy masz wiele pętli, które mogą być zagnieżdżone lub sekwencyjne lub nie.


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";
}
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.