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?

Alex
quelle

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";
}
TheTXI
quelle
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
William Holroyd
quelle
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.

Hans
quelle
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
6

Sie können das Schlüsselwort break verwenden .

Gabriel Sosa
quelle
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.

Patrick Michaelsen
quelle
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";
}
Piseth Sok
quelle