Abschnitt 4 · Lektion 6
Abbrechen und überspringen
Eine Schleife läuft normalerweise von vorn bis hinten durch. Zwei Wörter greifen mitten hinein, und beide brauchst du regelmäßig.
break, wenn du fertig bist
<?php
$regal = ["Hammer", "Zange", "Saege", "Bohrer", "Feile"];
$gesucht = "Saege";
foreach ($regal as $nummer => $werkzeug) {
echo "Nachgesehen: $werkzeug\n";
if ($werkzeug === $gesucht) {
echo "Gefunden, Nummer $nummer in der Liste.\n";
break;
}
}
echo "Die restlichen Werkzeuge hat niemand angesehen.\n"; break beendet die Schleife sofort. Der Rest des Blocks läuft nicht mehr, die verbleibenden Einträge
werden nicht mehr angesehen, und es geht hinter der schließenden geschweiften Klammer weiter.
Der klassische Fall ist die Suche. Sobald du gefunden hast, was du suchst, gibt es keinen Grund weiterzumachen. Im Beispiel siehst du das an der Ausgabe: Die letzten beiden Werkzeuge tauchen gar nicht mehr auf, obwohl sie in der Liste stehen.
Bei fünf Werkzeugen ist das egal. Bei fünftausend Datenbankzeilen ist es der Unterschied zwischen sofort und spürbar, und deshalb lohnt sich die Gewohnheit von Anfang an.
Die Nummer in der vorletzten Zeile ist die aus Lektion 4.5, und sie fängt bei null an. Die Säge ist der dritte Eintrag und trägt deshalb die 2. Wo eine solche Nummer für Menschen gedacht ist, rechnest du eins dazu, und genau das tust du gleich in der Challenge.
continue, wenn dieser eine Durchgang nichts soll
<?php
$eingaben = ["Mia", "", "Tom", "", "Lea"];
$gezaehlt = 0;
foreach ($eingaben as $eingabe) {
if ($eingabe === "") {
continue;
}
$gezaehlt++;
echo "Begruesst: $eingabe\n";
}
echo "Insgesamt begruesst: $gezaehlt\n"; continue beendet nicht die Schleife, sondern nur den aktuellen Durchgang. PHP springt zurück nach
oben und macht mit dem nächsten Eintrag weiter.
Im Beispiel stehen zwei leere Einträge in der Liste, und die sollen weder begrüßt noch gezählt
werden. Das continue steht ganz oben im Block, direkt hinter der Prüfung, und alles darunter läuft
für sie nie.
Achte auf den Zähler in der letzten Zeile: Er steht auf 3 und nicht auf 5. Die zwei übersprungenen
Durchgänge haben ihn nicht erreicht, und genau daran erkennst du in einer Ausgabe, ob dein
continue gegriffen hat.
Beides geht auch ohne
<?php
$eingaben = ["Mia", "", "Tom", "", "Lea"];
$gezaehlt = 0;
foreach ($eingaben as $eingabe) {
if ($eingabe !== "") {
$gezaehlt++;
echo "Begruesst: $eingabe\n";
}
}
echo "Insgesamt begruesst: $gezaehlt\n"; Dasselbe Ergebnis, ohne continue: Statt den unerwünschten Fall vorn abzufangen, packt man den
erwünschten in ein if. Die Ausgabe ist Zeile für Zeile identisch.
Welche Form die bessere ist, hängt davon ab, wie viel danach kommt. Bei drei Zeilen im Block ist das
if klarer. Bei dreißig Zeilen wandert der ganze Block eine Ebene nach rechts, nur wegen zweier
leerer Einträge, und dann ist das continue oben die freundlichere Lösung. Das ist derselbe Gedanke
wie der frühe Ausstieg aus Lektion 4.1: Sonderfälle nach vorn, damit der Normalfall geradeaus lesbar
bleibt.
Zahlen hinter break
<?php
for ($reihe = 1; $reihe <= 3; $reihe++) {
for ($spalte = 1; $spalte <= 3; $spalte++) {
echo "Feld $reihe-$spalte\n";
if ($reihe === 1 && $spalte === 2) {
break 2;
}
}
}
echo "Beide Schleifen sind zu Ende.\n"; Steckt eine Schleife in einer anderen, bezieht sich ein einfaches break immer auf die innere.
Willst du beide verlassen, schreibst du break 2. Für continue gibt es dieselbe Schreibweise.
Das funktioniert, und es ist trotzdem selten die beste Antwort. Die Zahl sagt nichts darüber aus, warum hier zwei Ebenen gemeint sind, und wer später eine dritte Schleife dazwischenschiebt, muss sie mit ändern. Vergisst er es, springt das Programm eine Ebene zu wenig, und niemand bemerkt es.
Im Kurs kommt break 2 deshalb genau einmal vor, nämlich hier. Wo verschachtelte Schleifen wirklich
gebraucht werden, ist die eigene Funktion aus Abschnitt 6 die bessere Antwort: Aus zwei Ebenen wird
ein return, und das ist eindeutig.
Die Falle: continue in einem switch
<?php
for ($i = 1; $i <= 3; $i++) {
switch ($i) {
case 2:
continue;
}
echo "Durchgang $i\n";
} Zum Schluss eine Merkwürdigkeit, über die viele stolpern. Ein switch zählt für break und
continue mit, als wäre er eine Schleife. Ein continue innerhalb eines switch bezieht sich also
auf den switch selbst, und dort tut es dasselbe wie break: Es verlässt den switch und läuft in
der Schleife ganz normal weiter.
Im Beispiel sollte der zweite Durchgang übersprungen werden. Er wird es nicht, alle drei Zeilen
erscheinen. Immerhin sagt PHP dazu etwas, und zwar auf dem Fehlerkanal: "continue" targeting switch is equivalent to "break". Did you mean to use "continue 2"?. Das Programm läuft trotzdem durch,
php index.php; echo $? im Terminal meldet eine 0, und ohne einen Blick auf den Fehlerkanal
merkst du nichts.
Das ist genau die Sorte Meldung, um die es in Lektion 1.4 ging: Sie bricht nichts ab, sie liefert
nur ein falsches Ergebnis. Gemeint war hier continue 2. Und noch besser gemeint wäre ein
match, denn dann stellt sich die Frage gar nicht erst.
Zum Mitnehmen
Zwei Wörter, die eine laufende Schleife steuern. break beendet sie ganz, continue überspringt nur den aktuellen Durchgang. Beide sind nützlich, und beide werden zum Problem, sobald man sie stapelt.
Jetzt du
Basis Konto, kostenlosZu dieser Lektion gehört eine Aufgabe. Du schreibst den Code selbst, und nach jedem Lauf sagt dir eine Prüfliste, was schon stimmt.
Dafür brauchst du das Basis Konto. Es kostet nichts, und ein Passwort gibt es auch nicht.
In diesem Kurs läuft dein Code auf einem Server. Dafür hat das Basis Konto 1 Stunde im Monat, mehr Zeit gibt es mit dem Premium Konto.
Was in dieser Lektion steckt
-
Artikel mit 5 Beispielen zum Ausprobieren
Steht hier, ohne Konto lesbar.
-
Aufgabe, dein Code läuft auf einem Server
Öffnet sich mit dem Basis Konto.