ausbrechen, wenn und foreach

277

Ich habe eine foreach-Schleife und eine if-Anweisung. Wenn eine Übereinstimmung gefunden wird, muss ich letztendlich aus dem Foreach ausbrechen.

foreach($equipxml as $equip) {
    $current_device = $equip->xpath("name");
    if ( $current_device[0] == $device ) {
        // found a match in the file            
        $nodeid = $equip->id;
        <break out of if and foreach here>
    }       
}
au_stan
quelle
für PHP nicht js. Ich kann nicht davon ausgehen, dass sie sich gleich verhalten.
Au_stan
6
gee - ich muss aufhören, jQuery so oft zu benutzen. Warum wurde dies abgelehnt? +1, absolut vernünftige und gut gestellte Frage.
Mrtsherman
11
Ich habe die Frage nur gestellt, weil ich (aus welchem ​​Grund auch immer) meinen Kopf nicht um das PHP Break Doc und ihre Beispiele wickeln konnte. alles gut aber. Ich bin nicht hier, um Abzeichen und Punkte zu bekommen, nur gute Antworten.
Au_stan

Antworten:

608

if ist keine Schleifenstruktur, daher können Sie nicht "ausbrechen".

Sie können jedoch ausbrechen, foreachindem Sie einfach anrufen break. In Ihrem Beispiel hat es den gewünschten Effekt:

foreach($equipxml as $equip) {
    $current_device = $equip->xpath("name");
    if ( $current_device[0] == $device ) {
        // found a match in the file            
        $nodeid = $equip->id;

        // will leave the foreach loop and also the if statement
        break;
    }
    this_command_is_not_executed_after_a_match_is_found();
}

Nur der Vollständigkeit halber für andere, die über diese Frage stolpern und nach einer Antwort suchen.

breaknimmt ein optionales Argument, das definiert, wie viele Schleifenstrukturen es brechen soll. Beispiel:

foreach (array('1','2','3') as $a) {
    echo "$a ";
    foreach (array('3','2','1') as $b) {
        echo "$b ";
        if ($a == $b) { 
            break 2;  // this will break both foreach loops
        }
    }
    echo ". ";  // never reached
}
echo "!";

Resultierende Ausgabe:

1 3 2 1!

Kaii
quelle
37
+1 - Tolle Beispiele für etwas, mit dem unerfahrene Programmierer manchmal zu kämpfen haben.
Jim D
1
Nützlich, danke. Zusätzliches Karma für die Erwähnung des Arguments. Die If-Loop-Sache scheint jedoch ein Hack zu sein. Warum nicht einfach den Rest der Aussagen in eine andere einschließen, wenn? Ich weiß, dass Sie nur versucht haben, hilfreich zu sein, aber beachten Sie die Neulinge.
Dan Barron
3
Für diejenigen unter Ihnen, die hier landen, aber suchen, wie sie aus einer Schleife ausbrechen können, die eine include-Anweisung enthält, verwenden Sie return, anstatt fortzufahren.
Nick Constantine
Was ist, wenn es eine switch-Anweisung ist? Switch-Anweisungen verwenden auch Pausen. Würde jemand einfach zwei Pausen in den Schalter einfügen, zB {case "break": echo 'break the switch and the loop'; brechen; brechen; }?
Jevon
@Jevon nein du würdest auch einfach switch($a) { case 'x': switch($b) { case 'x': break 2; }; break; } die inneren break 2Blätter schreiben beide switch Anweisungen.
Kaii
13
foreach($equipxml as $equip) {
    $current_device = $equip->xpath("name");
    if ( $current_device[0] == $device ) {
        // found a match in the file            
        $nodeid = $equip->id;
        break;
    }
}

Einfach benutzen break. Das wird es tun.

Anständiger Dabbler
quelle
Dann bricht die Pause vom Foreach und nicht vom If. Ich glaube, meine Verwirrung beruhte auf dieser Aussage, die if ($abort_if_block) break;ich ursprünglich gemacht hatte, break 2und sie schlug fehl. danke
au_stan
2
Achten Sie auf das Pausenkonstrukt. Wenn Sie das vergessen; Danach wird möglicherweise das Ergebnis des nächsten Ausdrucks angezeigt und es beginnt sich unerwartet zu verhalten (IE springt aus viel mehr heraus, als Sie gewollt hätten). Ich weiß, dass jeder gegen die Verwendung von GOTO spricht, aber ich denke, dass in all den Fällen, in denen man es nicht besser machen kann als eine Pause, ein goto eine bessere Option sein kann. Natürlich nur zum Vorwärtsspringen (auch nicht zu weit) und ohne Missbrauch! ;-)
Maraspin
2

Ein sicherer Weg, um eine foreachoder- whileSchleife in PHP zu unterbrechen, besteht darin, eine inkrementierende Zählervariable und eine ifBedingung innerhalb der ursprünglichen Schleife zu verschachteln . Dies gibt Ihnen eine strengere Kontrolle, als break;dies an anderer Stelle auf einer komplizierten Seite zu Chaos führen kann.

Beispiel:

// Setup a counter
$ImageCounter = 0;

// Increment through repeater fields
while ( condition ):
  $ImageCounter++;

   // Only print the first while instance
   if ($ImageCounter == 1) {
    echo 'It worked just once';
   }

// Close while statement
endwhile;
Serraosays
quelle
Die Syntax ist nicht korrekt. Wenn Sie die endwhileAnweisung verwenden möchten , müssen Sie schreiben while (..): ...; endwhile;- notieren Sie den Doppelpunkt hier nach while!
Kaii
0

Für diejenigen unter Ihnen, die hier landen, aber suchen, wie sie aus einer Schleife ausbrechen können, die eine include-Anweisung enthält, verwenden Sie return anstelle von break oder continue.

<?php

for ($i=0; $i < 100; $i++) { 
    if (i%2 == 0) {
        include(do_this_for_even.php);
    }
    else {
        include(do_this_for_odd.php);
    }
}

?>

Wenn Sie in do_this_for_even.php brechen möchten, müssen Sie return verwenden. Wenn Sie break oder continue verwenden, wird der folgende Fehler zurückgegeben: 1 Ebene kann nicht unterbrochen / fortgesetzt werden. Ich habe hier mehr Details gefunden

Nick Constantine
quelle