Können Sie eine Schleife in PHP "beenden"?


118

Ich habe eine Schleife, die Fehler in meinem PHP-Code überprüft. Ursprünglich sah es ungefähr so ​​aus ...

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
}

Das funktioniert alles gut und schön, aber es wird immer noch durchlaufen, obwohl es nach einem Fehler nicht nötig ist. Gibt es eine Möglichkeit, der Schleife zu entkommen?

Antworten:


211

Sie suchen nach der break- Anweisung.

$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, es beantwortet die Frage, das Codebeispiel ist genau das, ein Beispiel. Sie können sich genauso gut über den nicht beschreibenden Array-Namen "$ arr" beschweren.
Paxdiablo

5
@ Gabriel: Ich poste einen Code, auf den direkt im PHP-Handbuch verwiesen wird, und er zeigt genau die Verwendung der break-Anweisung.
TheTXI

@Pax, für mich ist das subjektiv, jedes Mal, wenn ich ein Beispiel anführe, habe ich versucht, einen Code für die reale Welt einzufügen.
Gabriel Sosa

1
@Gabriel: Sie haben überhaupt kein Beispiel gepostet, und der Link, den Sie angegeben haben, verweist auf genau dieselbe Quelle, die ich angegeben habe (daher stammt der Beispielcode ganz oben). Sie haben im Grunde das Gleiche getan wie ich, aber es so gemacht, dass das OP das Beispiel erst sieht, nachdem er auf den Link geklickt hat.
TheTXI

3
Das ist jedoch eine seltsame Art, eine Schleife zu erstellen!
Alex

151

Wie in anderen Beiträgen angegeben, können Sie das Schlüsselwort break verwenden. Eine Sache, die angedeutet, aber nicht erklärt wurde, ist, dass das Schlüsselwort einen numerischen Wert annehmen kann, um PHP mitzuteilen, von wie vielen Ebenen abgehoben werden soll.

Wenn Sie beispielsweise drei ineinander verschachtelte foreach-Schleifen haben, um eine Information zu finden, können Sie 'break 3' ausführen, um aus allen drei verschachtelten Schleifen herauszukommen. Dies funktioniert für die Strukturen 'for', 'foreach', 'while', 'do-while' oder '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
Guter Punkt. Es wird ziemlich deutlich im PHP-Handbuch oben erklärt. Ich denke nicht, dass dies für diese spezielle Frage zwingend erforderlich war, aber das ist immer noch sehr gut zu wissen. +1
TheTXI

46

break; verlässt deine Schleife.

continue; Überspringt einen beliebigen Code für den Rest dieser Schleife und fährt mit der nächsten Schleife fort, solange die Bedingung noch erfüllt ist.


genau das, was ich brauchte .. das "weiter", um nur die aktuelle Schleife zu brechen und nicht die gesamte Schleife zu verlassen, wie es die Pause tut.
K. Kilian Lindberg


4

All dies sind gute Antworten, aber ich möchte noch eine vorschlagen, die meiner Meinung nach ein besserer Codestandard ist. Sie können ein Flag in der Schleifenbedingung verwenden, das angibt, ob die Schleife fortgesetzt werden soll oder nicht, und vermeiden, breakalle zusammen zu verwenden.

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

Ich halte dies für eine bessere Code-Praxis, da sie nicht vom verwendeten Bereich breakabhängt. Sie definieren vielmehr eine Variable, die angibt, ob eine bestimmte Schleife unterbrochen werden soll oder nicht. Dies ist nützlich, wenn Sie viele Schleifen haben, die möglicherweise verschachtelt oder sequentiell sind oder nicht.


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";
}
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.