PHP 5.6 Stephan Heller 1. Ausgabe, März 2015 Grundlagen zur Erstellung dynamischer Webseiten ISBN: 978-3-86249-415-6 GPHP56 5 Kontrollstrukturen 5.7 Schleifen Schleifen verwenden Um einen bestimmten Teil des Programms mehrfach auszuführen bzw. zu wiederholen, benötigen Sie Schleifen. Durch die Verwendung von Schleifen sparen Sie Programmcode und können variabel festlegen, wie oft oder bis zum Eintreffen welcher Bedingung die Schleife durchlaufen werden soll. Folgende Schleifen gibt es in PHP: D while- bzw. do-while-Schleife: Wenn Ihnen als Programmierer nicht bekannt ist, wie oft eine Anweisung wiederholt werden soll, bzw. Sie eine Schleife so lange ausführen möchten, bis eine bestimmte Bedingung eingetreten ist, verwenden Sie die while- bzw. do-while-Schleife. D for-Schleife: Wenn Sie die genaue Anzahl kennen oder diese vorher über PHP ermitteln können, wie oft eine Anweisung wiederholt werden soll, verwenden Sie die for-Schleife. 5.8 Mit der while-Schleife arbeiten In einer while-Schleife prüft PHP zu Beginn die vorgegebene Bedingung und führt den angegebenen Anweisungsblock so lange aus, bis die Bedingung nicht mehr erfüllt ist. Diese Prüfung wird automatisch vor jedem Durchlauf wiederholt. Ergibt der Test der Bedingung den Wert TRUE, wird die Schleife durchlaufen. Liefert die Bedingung den Wert FALSE zurück, werden die Anweisungen der Schleife übersprungen und die Abarbeitung des Programms wird nach der Schleife fortgesetzt. Eine Prüfung vor der Ausführung des Anweisungsblocks wird als kopfgesteuert bezeichnet. Ergibt bereits die erste Bedingungsprüfung den Wert FALSE, wird der Anweisungsblock gar nicht ausgeführt, d. h., eine while-Schleife kann null Mal bis unendlich oft (sogenannte Endlosschleife) ausgeführt werden. Syntax und Bedeutung der while-Schleife D Das Schlüsselwort while leitet die while-Schleife ein. In runden Klammern wird die Bedingung angegeben, die vor der Abarbeitung überprüft wird. D Ist der Rückgabewert der Bedingung TRUE, wird der Anweisungsblock im Schleifenkörper ausgeführt. D Nach der letzten Anweisung des Anweisungsblocks bzw. mit Erreichen der schließenden geschweiften Klammer springt PHP zum Anfang der Schleife zurück und überprüft erneut die Bedingung. Ist das Ergebnis der Bedingungsprüfung TRUE, wird der Anweisungsblock erneut ausgeführt. D Diese Schritte werden so lange wiederholt, bis die Auswertung der Bedingungsprüfung am Beginn der Schleife den Wert FALSE liefert. Die Schleife wird dann verlassen und der PHP-Code nach der Schleife weiter abgearbeitet. while(Bedingung) { Anweisungsblock; } Beispiel: while.php <?php $zahl = 1; while ($zahl <= 100) { echo "$zahl<br>"; $zahl = $zahl + $zahl; } ?> © HERDT-Verlag 49 5 PHP 5.6 - Grundlagen zur Erstellung dynamischer Webseiten Der Startwert der Variablen $zahl wird auf den Wert 1 festgelegt. Die Bedingung legt fest, dass die while-Schleife so lange wiederholt werden soll, wie der Wert der Variablen $zahl kleiner oder gleich 100 ist. Bedenken Sie, dass die Schleife nicht ein einziges Mal ausgeführt wird, wenn der Wert der Variablen bereits beim ersten Schleifendurchlauf größer als 100 sein sollte. In jedem Schleifendurchlauf erfolgt die Ausgabe der Variablen $zahl. Der Variablen $zahl wird an dieser Stelle ein neuer Wert zugewiesen, im Beispiel wird sie verdoppelt. Anzeige der Beispieldatei "while.php" Die while-Schleife wird durch die schließende Klammer beendet. Nach jedem Schleifendurchlauf wird die Bedingung erneut geprüft . Der Anweisungsblock in der Schleife wird so lange ausgeführt, bis die Bedingungsprüfung FALSE ergibt. Damit ist dann die Schleife beendet und die Abarbeitung des Skripts wird nach der Schleife fortgesetzt. Häufige Fehler beim Einsatz von Schleifen Die in diesem Abschnitt beschriebenen Fehler ergeben keine Fehlermeldungen, sondern einzig ein unerwartetes Verhalten des Programms. Es handelt sich um logische Fehler: D Es kann passieren, dass der Variablen, die geprüft werden soll, ein Wert zugewiesen wurde, bei dem die Bedingungsprüfung am Anfang der Schleife gleich beim ersten Schleifendurchlauf den Wert FALSE ergibt. Das heißt, die Schleife wird nicht ein einziges Mal ausgeführt, sondern übersprungen. Achten Sie darauf, dass die Bedingungsprüfung im ersten Schleifendurchlauf den Wert TRUE ergibt. Endlosschleifen vermeiden Schleifen bergen grundsätzlich die Gefahr, dass sie durch eine falsche Logik in der Programmierung in eine Endlosschleife laufen. Dies wird Ihnen nicht als PHP-Fehler gemeldet. Der Aufruf der Datei ist möglich, das Skript bricht ab, wenn die vom Server erlaubte Laufzeit erreicht ist (diese wird in der php.ini über den Parameter max_execution_time bestimmt und ist standardmäßig auf 30 Sekunden eingestellt). Ist die Skript-Laufzeit erhöht worden, werden große Datenmengen verarbeitet oder viele Datenbankaufrufe in der Schleife abgesendet, kann dies zum Absturz Ihres Browsers oder sogar des ganzen Webservers führen. Um Endlosschleifen zu vermeiden, müssen Sie darauf achten … D D dass der Wert der zu testenden Variablen innerhalb der Schleife verändert wird und dass Sie die Variable so verändern, dass die Schleife nicht endlos ausgeführt wird. Beispielsweise macht es bei einem Variablenwert 1 und einer Bedingung, dass die Schleife so lange durchlaufen wird, bis die Variable > 5 ist, wenig Sinn, bei jedem Schleifendurchlauf den Wert der Variablen herabzusetzen. In diesem Fall würde die Schleife nicht enden, da die Bedingungsprüfung immer das Ergebnis TRUE liefert. Mit der do-while-Schleife arbeiten Im Unterschied zur while-Schleife, die die Bedingung für die Wiederholung am Anfang hat, wird in der dowhile-Schleife die Bedingung erst nach der letzten Anweisung in der Schleife überprüft. Man spricht deshalb von einer fußgesteuerten Schleife. Daraus folgt auch, dass der Anweisungsblock immer mindestens einmal ausgeführt wird. Auch hier gilt wie bei der while-Schleife: Liefert die Bedingung einen Wert TRUE zurück, wird die Schleife erneut durchlaufen, ansonsten wird sie verlassen. 50 © HERDT-Verlag 5 Kontrollstrukturen Syntax und Bedeutung der do-while-Schleife D D Das Schlüsselwort do leitet die Schleife ein. D Am Ende der Schleife wird die Bedingung der Schleife über das Schlüsselwort while ausgewertet. Die Bedingung wird in runden Klammern angegeben. D Trifft die Bedingung zu, wird die Schleife erneut ausgeführt. 5.9 Die Anweisungen im Schleifenkörper werden auf jeden Fall mindestens einmal ausgeführt. do { Anweisungsblock; } while (Bedingung); Mit der for-Schleife arbeiten Im Unterschied zur while-Schleife, die so oft durchlaufen wird, bis der Test der Bedingung FALSE ergibt, wird in der for-Schleife genau angegeben, wie oft die Schleife durchlaufen werden soll. Bei der for-Schleife kann berechnet werden: D D die Anzahl der Wiederholungen oder Beginn und Ende der Wiederholung. Übergeben werden der Start- und Endwert sowie die Bedingung, wie der Endwert erreicht werden soll. Syntax und Bedeutung der for-Schleife D D Die for-Schleife beginnt mit dem reservierten Schlüsselwort for. Mit der Anweisung Initialisierung wird der Anfangswert für die Schleife festgelegt. for ( Initialisierung; Bedingung; Reinitialisierung) { Anweisungsblock; } D Die Anweisung Bedingung legt fest, unter welchen Konditionen die Schleife durchlaufen wird. Diese Bedingung, die vor jedem Durchlauf abgefragt wird, liefert einen Wert TRUE oder FALSE zurück. Ist der Wert TRUE, wird die Schleife durchlaufen. Andernfalls wird das Programm mit den Anweisungen nach der for-Schleife fortgesetzt. Die Bedingung überprüft den Initialwert noch vor dem ersten Durchlauf. Ist das Ergebnis dieser ersten Überprüfung bereits mit den Initialwerten FALSE, wird die Schleife erst gar nicht durchlaufen. D Die Anweisung Reinitialisierung legt fest, wie die Variable verändert werden soll, die in der Bedingung ausgewertet wird. Diese Veränderung geschieht am Ende der Schleife, also nicht am Anfang, d. h., erst beim zweiten Durchlauf der Schleife ist der Wert, der in der Initialisierung gesetzt wurde, verändert. D Die drei Anweisungen werden jeweils durch ein Semikolon voneinander getrennt. Beispiel: for.php Die Schrift eines angezeigten Beispieltextes wird mithilfe einer Schleife schrittweise verkleinert. <?php for ($groesse = 25; $groesse >= 10; $groesse -= 5) { echo "<p style='font-size:" . $groesse . "px'>Schriftgröße $groesse px</p>"; } ?> © HERDT-Verlag 51 5 PHP 5.6 - Grundlagen zur Erstellung dynamischer Webseiten Der Startwert der for-Schleife wird über die Zuweisung des Wertes 25 an die Variable $groesse festgelegt. Die Bedingung besagt, dass die Schleife durchlaufen werden soll, solange der Wert der Variablen $groesse größer oder gleich 10 ist. Nach jedem Durchlauf wird der Wert um 5 verringert. Die Variable $groesse steuert über ihren Wert die Schriftgröße der auszugebenden Zeile und wird darüber hinaus ausgegeben. Das Ende der for-Schleife ist erreicht. Der Interpreter weist der Variablen $groesse einen um 5 kleineren Wert zu und springt wieder zurück zur Zeile . Dort wird erneut geprüft, ob die Schleife nochmals durchlaufen werden Anzeige der Beispieldatei "for.php" muss. Beispiele für Operatoren in for-Schleifen Bei der Arbeit mit einer for-Schleife können Sie z. B. mit folgenden Operationen arbeiten: Bedingung in der for-Schleife Werte von $i for ($i = 1; $i <= 5; $i++) 1, 2, 3, 4, 5 for ($i = 1; $i < 5; $i++) 1, 2, 3, 4 for ($i = 15; $i >= 10; $i--) 15, 14, 13, 12, 11, 10 for ($i = 15; $i > 10; $i--) 15, 14, 13, 12, 11 for ($i = 0; $i < 100; $i = $i + 10) 0, 10, 20, 30, 40, 50, 60, 70, 80, 90 for ($i = 1; $i <= 10; $i = $i + 1.2) 1, 2.2, 3.4, 4.6, 5.8, 7, 8.2, 9.4 5.10 Schleifen abbrechen Schleifenabbruch mit break Nicht immer ist es notwendig, eine for-, while- oder do-while-Schleife so lange zu durchlaufen, bis die definierte Bedingung ein FALSE ergibt und damit die Schleife beendet wird. Auch innerhalb des Schleifendurchlaufs können andere Kriterien geprüft werden, die das weitere Durchlaufen der Schleife überflüssig machen. Beispiel: Sie haben eine Array-Variable mit 300 Einträgen (Arrays vgl. Kapitel 6) und suchen darin einen bestimmten Wert. Dafür definieren Sie eine for-Schleife mit 300 Durchläufen. In jedem Durchlauf wird ein einzelner Eintrag der Array-Variablen untersucht. Sie finden den Wert bereits beim dritten Durchlauf, trotzdem wird die Untersuchung 300-Mal durchgeführt, bis die Bedingung der for-Schleife diese beendet. Hier ist es sinnvoll, aus der Schleife auszusteigen, um damit Rechenzeit des Skripts zu sparen. Dies ist mit der Anweisung break möglich. 52 © HERDT-Verlag 5 Kontrollstrukturen Beispiel: break.php <?php $budget = 50; $einzelpreis = 9; $menge = 1; while ($menge <= 15) { // Idealfall: 15 Stück kaufen $gesamtpreis = $einzelpreis * $menge; if ($gesamtpreis > $budget) { // Budget erschöpft? Wenn ja: Abbruch echo "<p><strong>Ihr Budget ist leider erschöpft.</strong></p>"; break; } echo "<p>$menge Stück: $gesamtpreis Euro.</p>"; $menge++; } ?> Der Startwert der while-Schleife wird über die Zuweisung des Wertes 1 an die Variable $menge festgelegt. Die Bedingung besagt, dass die Schleife durchlaufen werden soll, solange der Wert der Variablen $menge kleiner oder gleich 15 ist. Die Schleife soll allerdings nur ausgeführt werden, bis der Gesamtpreis das zur Verfügung stehende Budget übersteigt. Wenn das passiert, wird die Schleife durch den Befehl break im Anschluss an eine Meldung abgebrochen. Die Variable $menge wird bei jedem Schleifendurchlauf um eins erhöht ($menge++). Anzeige der Beispieldatei "break.php" Vorzeitiger Sprung zum nächsten Schleifendurchlauf mit continue In Schleifen wird der PHP-Code vom Schleifenkopf bis zum Schleifenende vollständig durchlaufen. Es ist jedoch denkbar, dass bei einer bestimmten Bedingung das Ausführen des Codes bis zum Schleifenende überflüssig ist, allerdings sollen weitere Schleifendurchläufe ausgeführt werden. Für diesen Fall steht das Schlüsselwort continue zur Verfügung. Damit beenden Sie einen einzelnen Schleifendurchlauf, die Schleife wird mit dem nächsten Schleifendurchlauf fortgesetzt. Bei for-Schleifen wird hier auch die Anweisung der Reinitialisierung ausgeführt, auch wenn das Ende der Schleife noch nicht erreicht wurde. Beispiel: continue.php <?php $zaehler = 5; for ($nenner = -2; $nenner <= 2; $nenner++) { if ($nenner == 0) { echo "<p>Division durch 0 ist verboten.</p>"; continue; } $ergebnis = $zaehler / $nenner; echo "<p>$zaehler / $nenner = " . $ergebnis . "</p>"; } ?> © HERDT-Verlag 53 5 PHP 5.6 - Grundlagen zur Erstellung dynamischer Webseiten In einer for-Schleife sollen die Ergebnisse einer Division von $zaehler und $nenner berechnet und ausgegeben werden. $zaehler besitzt mit 5 einen festen Wert. Der Wert der Variablen $nenner wird durch die for-Schleife verändert (von -2 bis 2). Um keinen schwerwiegenden Fehler (Division durch 0) auszulösen, soll die Division nicht durchgeführt werden, wenn die Variable $nenner den Wert 0 aufweist. In dem Fall wird der aktuelle Schleifendurchlauf nach einer echo-Anweisung per continue beendet. Beachten Sie, dass die Reinitialisierung $nenner++ auch ausgeführt wird, wenn das Schleifenende noch nicht erreicht ist. Die Variable $nenner wird um 1 hochgezählt und die Schleife mit diesem Wert fortgesetzt. Sofern der aktuelle Schleifendurchlauf nicht abgebrochen wurde, erfolgt an dieser Stelle die Berechnung und anschließend die Ausgabe des Ergebnisses. 5.11 Anzeige der Beispieldatei "continue.php" Übung Kontrollstrukturen in PHP: switch Übungsdatei: -- Ergebnisdatei: bewertung_switch.php Erstellen Sie ein Programm (bewertung_switch.php), das die Bewertung eines Tests in Textform ausgibt. Realisieren Sie diese Aufgabe mithilfe einer switch-Auswahlschleife. Legen Sie die erreichte Punktzahl innerhalb des Skripts fest. Die Bedeutung der Punkte lautet: 10 Punkte: Sehr gut 9 Punkte: Gut 8 Punkte: Befriedigend 7 Punkte: weniger als 7: Ausreichend Leider zu wenige Punkte erreicht Kontrollstrukturen in PHP: for Übungsdatei: -- 54 Ergebnisdatei: bewertung_switch-2.php Erweitern Sie das Programm bewertung_switch.php, indem Sie eine Schleife programmieren, die automatisch die Bewertung des Tests mithilfe einer for-Schleife für erreichte Punktzahlen von 10 bis 0 Punkte ausgibt. Speichern Sie die Datei unter dem Namen bewertung_switch-2.php. © HERDT-Verlag 5 Kontrollstrukturen Anzeige der Ergebnisdatei "bewertung_switch-2.php" Kontrollstrukturen in PHP: while und do-while Übungsdatei: -- Ergebnisdatei: while_do-while.php Entwerfen Sie ein Programm (while_do-while.php), das untereinander die Zahlen 1 - 5 ausgibt. Weisen Sie einer Variablen $zahl den Startwert 1 zu und verwenden Sie eine while-Schleife. Realisieren Sie die Aufgabe anschließend zusätzlich in derselben Datei mit einer do-while-Schleife. Wenn Sie die Ausgaben von 1 - 5 realisiert haben, weisen Sie der Variablen $zahl den Startwert 20 zu. Vergleichen Sie das Verhalten der while-Schleife mit dem der do-whileSchleife. Anzeige der Ergebnisdatei "while_do-while.php" mit Startwert 1 (links) und Startwert 20 (rechts) für die Variable $zahl © HERDT-Verlag 55