Author: Progman, zuletzt bearbeitet von progman @ 2005/09/11 00:22:27
Bitte beachten Sie, dass die Tutorialkapitel zusammenhängen. Wenn sie direkt auf ein Kapitel verlinkt wurden müssen Sie gegebenenfalls die vorherigen Kapitel auch lesen. Achten Sie beim lesen darauf, dass Sie kein Kapitel überspringen.
Schleifen
- Was sind Schleifen?
- Die While-Schleife
- do-while-Schleife
- for-Schleife
- break; und continue;
- Wann for, wann while?
1. Was sind Schleifen?
Manchmal möchte man einen Programmteil öfters statt nur einmal aufrufen. Und manchmal möchte man den fraglichen Programmteil mit etwas anderen Variablen und Werten aufrufen. Dies ist z.B. einem News-system der Fall. Jede News hat zwar einen unterschiedlichen Text, aber sie hat den selben Aufbau. Oben links das Datum, oben rechts der Autor, in der Mitte der Titel und unten der Text. Also wäre es doch gut wenn man nicht 10 mal eine CSS-Layout für die Newsbeiträge mit 10 echo's ausgibt, sondern nur 1 echo benutzt, der dann jede News mit den Daten ausgibt. Dafür gibt es Schleifen.
Es gibt in PHP 4 Arten von Schleifen. In diesem Kapitel werden nur 3 durchgenommen. Das sind die for-, while- und do-while-Schleifen. Die foreach ist für Arrays gedacht, die wir später durchnehmen.
2. Die While-Schleife
Die while-Schleife ist wie folgt aufgebaut.
<?php
while (bedingung) {
// Programmcode
}
//bzw.
while (bedingung)
ein_befehl();
?>
Da wo bedingung steht kommt dann eine Bedingung rein, wann bzw. wie lange die while-Schleife ausgeführt werden soll. Wenn die Bedingung true ist, wird der Schleifen-Teil ausgeführt, wenn die Bedinung false ist, wird der Schleifen-Teil logischerweise nicht ausgeführt. Wenn PHP am Ende angekommen ist springt PHP wieder zu while (bedingung) und prüft die Bedingung nach. Wenn diese wieder true ist wird wieder der Schleifen-Teil ausgeführt. Nach dem Ende des Schleifenteils guckt PHP sich wieder die Bedingung an. Wenn diese true ist wird wieder der Schleifenteil ausgeführt. PHP führt also solange den Schleifenteil aus solange die Bedingung true ergibt. While ist Englisch und bedeutet während, in der Programmiersprache eher solange. "Solange die Bedingung wahr/true ist, führe den Schleifen-Teil aus". Die Bedingung sollte kein konstanter Ausdruck sein, sondern ein variabler Ausdruck mit Variablen, deren Inhalt sich in der while-schleife ändert. Denn sonst kann es passieren, dass ihr eine Endlosschleife habt, die nicht aufhört, bis der Webserver das Script nach 30sec automatisch beendet.
<?php
while (true) { // die Bedinung ist immer true
echo "crash ";
}
?>
Dies ist eine typische Endlosschleife, der Schleifeninhalt wird immer und immer wieder ausgeführt, bis der Webserver von sich aus das Script stoppt.
Ein anderes Beispiel für eine while-Schleife könnte so aussehen.
<?php
$x = 4;
while (0 < $x) {
echo "Der Wert ist ".$x."<br />\n";
$x--;
}
?>
Dies erzeugt folgende Ausgabe:
Der Wert ist 4 Der Wert ist 3 Der Wert ist 2 Der Wert ist 1
Beim letzen Durchlauf wird 1 zu 0. Und dann ist die Bedingung nicht mehr erfüllt, 0 < 0 ergibt false. Somit wird die while-schleife übersprungen und es geht normal im Code weiter. Wäre $x schon vor der Schleife kleiner gleich 0 würde die Schleife nicht ein einziges Mal ausgeführt, da die Bedingung ja false ist.
3. do-while-Schleife
Die do-while-Schleife ist wie folgt aufgebaut
<?php
do {
// PHP-Code
}
while (bedingung);
// bzw.
do
ein_befehl();
while (bedingung);
?>
Das Semikolon hinter dem do-while ist notwendig, bei der normalen while-Schleife ist es, wie bei der If-Abfrage, unerwünscht. Der Unterschied der do-while-Schleife zur while-Schleife ist der, dass die do-while-Schleife mindestens 1 mal ausgeführt wird, da die Überprüfung der Bedingung erst am Schleifenende erfolgt. Wenn in der Bedinung false steht, wird diese Schleife genau 1 mal durchgeführt.
<?php
do {
echo "Hi";
}
while (false);
?>
Dies gibt genau einmal den String "Hi" aus. Nehmen wir mal folgenden Code als echtes Beispiel.
<?php
$x=2;
do {
echo "Der Wert ist ".$x."<br />\n";
$x--;
}
while (0 < $x);
?>
Diese Schleife gibt folgendes aus.
Der Wert ist 2 Der Wert ist 1
Beim letzen durchlauf hat die Variable $x den Wert 1. Der Text "Der Wert ist 1" wird ausgegeben und dann wird $x dekrementiert bzw. um 1 verringert. Somit hat sie den Wert 0 und die Bedingung ergibt false.
<?php
$x = -10;
do {
echo "Der Wert ist ".$x."<br />\n";
$x--;
}
while (0 < $x);
?>
Bei diesem Beispiel würde folgendes ausgegeben werden.
Der Wert ist -10
Da wir wissen das -10 nicht größer als 0 ist, wird der Schleifen-Inhalt trotzdem ausgeführt, da die Überprüfung der Bedingung erst am Ende durchgeführt wird.
Die Benutzung einer do-while-Schleife kommt in einem PHP-Projekt nicht so häufig vor, wenn nicht sogar garnicht. Bei der while-Schleife spricht man von einer Kopfgesteuerten-while-Schleife und bei einer do-while-Schleife von einer Fussgesteuerten-while-Schleife.
4. for-Schleife
Die for-Schleife benutzt man sehr häufig wenn man einen Programmcode genau x-mal ausführen lassen möchte. Der Aufbau der for-Schleife ist wie folgt.
<?php
for (startanweisung; bedingung; durchlaufanweisung) {
// PHP-Code
}
// bzw.
for (startanweisung; bedingung; durchlaufanweisung)
ein_befehl();
?>
Diese Schleife wird auch wieder nur solange ausgeführt solange die Bedingung bedingung erfüllt ist. Dies ist also wie eine while-Schleife. Sie hat aber noch ein paar extra Felder, in denen man Anweisungen reinschreiben kann. Ins Feld startanweisung kommt eine Anweisung die 1 mal ausgeführt wird, nämlich beim starten der for-Schleife. Diese Anweisung wird auch ausgeführt, wenn die Bedingung schon vor dem Schleifeneintritt false ist. An der Stelle durchlaufanweisung kommt eine Anweisung die bei jedem Schleifendurchlauf ausgeführt wird. Diese Anweisung wird immer vor einem nächsten Schleifendurchlauf ausgeführt (außer beim 1. durchlauf). Eine for-Schleife kann auch als while-Schleife aufgebaut werden.
<?php
startanweisung;
while (bedingung) {
// PHP-Code
durchlaufanweisung;
}
?>
Dies ist aber keine echte bzw. keine gültige Umformung, da jetzt die Anweisungen break; und continue; ausgelassen wurden. Und dies heißt auch nicht das im Teil startanweisung, der ganze Programmcode rein kann, der vor einer for-schleife steht, so wie es jetzt in der Umschreibung von for zu while aussehen mag.
Eine Typische Anwendung für eine for-Schleife ist diese hier.
<?php
for ($i=0; $i<5; $i++) {
echo "Die Zahl ist ".$i."<br />\n";
}
?>
Dieser Code gibt folgendes aus.
Die Zahl ist 0 Die Zahl ist 1 Die Zahl ist 2 Die Zahl ist 3 Die Zahl ist 4
Hier wird zuerst die Startanweisung ausgeführt. Dort wird die Variable $i initialisert und auf 0 gesetzt. Dies ist unsere sogenannte Laufvariable für unsere for-Schleife. Bei for-Schleifen benutzt man üblich die Variablen $i und $j, je nachdem wieviele for-schleife ineinander verschachtelt sind. Das echo im for-Teil gibt auch den Wert der Variable aus, hier 0. Nach der Abarbeitung des for-Teils wird die Durchlaufanweisung durchgeführt. Da wird die Variable $i inkrementiert bzw. um 1 erhöht. Nun wird wieder die Zahl ausgegeben. Das geht so weiter bis der Wert der Zahl 4 ist. Nachdem die 4 ausgegeben wurde, wird wieder die Durchlaufanweisung ausgeführt. $i ist nun 5. Und jetzt ist die Bedinung für einen nächsten Durchlauf nicht mehr erfüllt. Die for-Schleife wird übersprungen und dann geht es normal weiter im Code. Man hat genau 5 Durchläufe. Von 0 bis 4. Wenn man aber von 1-5 Zählen möchte gibt es 2 Möglichkeiten. Entweder man ändert den for-Kopf wie folgt ab.
<?php
for ($i=1; $i<=5; $i++) {
// ...
?>
Oder man ändert die echo-Anweisung etwas ab.
<?php
// ...
echo "Die Zahl ist ".($i+1)."<br />\n";
// ...
?>
Doch meistens muss man von 0 aus zählen, insbesondere wenn man Arrays benutzt.
Beim Verschachteln von for-Schleifen muss man darauf achten dass man sich nicht die Lauf-Variablen überschreibt. Deswegen nimmt man für die 1. for-schleife $i, für die 2. $j, für die 3. $k... . Wenn die for-Schleifen untereinander stehen und nicht verschachtelt sind, ist es eigentlich egal das man die Variablen überschreibt, es sei denn man will den Wert der for-Schleifen-Durchlauf-Variablen noch woanders in seinem Script weiterbenutzen.
5. break; und continue;
Die Anweisung break; kennen wir schon. Diese Anweisung verlässt eine Schleifen oder ein switch. Die Anweisung continue; beendet den aktuellen Schleifendurchlauf und beginnt mit den nächsten. Das heißt, bei einem continue; springt PHP wieder nach oben und führt den nächsten Schleifendurchlauf durch. Bei einer for-Schleifen wird noch zusätzlich die Durchlaufanweisung ausgeführt.
Bei break und continue kann man eine optionale Zahl anhängen. Mit der gibt man an, welche übergeordnete Schleife bzw. Switch-Abfrage verlassen bzw. neu durchlaufen möchte. Die Anweisung break 2; beendet also nicht die aktuelle Schleife sondern die Schleife da drüber. break; ist das selbe wie break 1;.
6. Wann for, wann while?
Bei den verschiedenen Schleifentypen fragt man sich doch, warum es die gibt bzw. wann man welche benutzten muss. Also, die Benutzung der richtigen Schleife hängt von der Anzahl der Schleifendurchläufe ab. Wenn man weiß wie oft eine Schleife durchläufen werden soll, nimmt man die for-Schleife. Denn da kann man angeben wie oft diese Durchlaufen soll, nämlich mit for ($i=0; $i<ANZAHL; $i++). Die while-Schleife hingegen benutzt man wenn man nicht weiß wie oft die Schleife durchgelaufen wird. Dies ist z.B. beim Auslesen von Dateien und arbeiten mit MySQL der Fall, da man beim Programmieren nicht weiß wieviele Daten ausgelesen werden können.
Fragen zum aktuellen Thema
- Was ist eine Fuss- bzw. Kopfgesteuerte Schleife?
- Schreiben sie ein Programm was alle geraden Zahlen zwischen einschließlich 0-20 ausgibt
- Was ist eine Fuss- bzw. Kopfgesteuerte Schleife?
-
Die do-while-Schleife nennt man Fussgesteuerte Schleife, wo hingegen man eine while-Schleife eine Kopfgesteuerte Schleife nennt, da einmal die Überprüfung oben und einmal unten durchgeführt wird.
- Schreiben sie ein Programm was alle geraden Zahlen zwischen einschließlich 0-20 ausgibt
-
Dies könnte eine mögliche Lösung sein.
<?php
for ($i=0;$i<=20;$i+=2) {
echo $i." ";
}
?>