Schleifen


Schleifen in PHP

Wenn eine größere Anzahl von Datensätzen eine immer gleiche Routine durchlaufen sollen, dann verwendet man dafür Schleifen. Mit der Funktion „for“ können Schleifen eine vorherbestimmte Anzahl an Durchläufen haben und mit „while“ und „do while“ wird sie so oft wiederholt, bis eine Bedingung erfüllt ist. Mit „foreach“ ist es sehr einfach, Arrays zu durchlaufen und ihren Inhalt auszuwerten.

„while“ und „do … while“
Der Unterschied zwischen der „while“- und „do … while“- Schleife ist der Zeitpunkt, wann die Bedingung für den Durchlauf überprüft wird. „while“ ist eine sogenannte kopfgesteuerte Schleife, denn die Überprüfung findet gleich zu Beginn statt. Ergibt sie nicht den Wert „true“, wird die Schleife auch niemals ausgeführt. Anders ist es mit „do … while“, denn hier wird am Ende geprüft, die Schleife also mindestens einmal durchlaufen. Zu einer Schleife gehört darüber hinaus ein Wert, der ihre Bedinung ändert, denn sonst wird sie unendlich oft durchlaufen. Meistens wird ein vorhandener Datensatz abgearbeitet, wie bei „foreach“, wo das zu durchlaufende Array das Ende der Schleife vorgibt, oder es wird eine Variable hoch- beziehungsweise runtergezählt und die Schleife dann abgebrochen, wenn ein bestimmter Wert erreicht wurde.

Im folgenden Beispiel sollen Radiobuttons als Antwortmöglichkeiten für eine Umfrage erzeugt werden. Die Umfrage umfasst zehn Fragen, die jeweils mit „ja“, „nein“ oder „weiß nicht“ beantwortet werden können.

<?php
$i = 1;
while ($i <= 10) {
$radiobutton = „Frage $i:<br>
<input type=\“radio\“ name=\“antwort[$i]\“ value=\“1\“>ja<br>
<input type=\“radio\“ name=\“antwort[$i]\“ value=\“2\“>nein<br>
<input type=\“radio\“ name=\“antwort[$i]\“ value=\“3\“>weiß nicht“;
echo „<p>$radiobutton</p>“;
$i++;
}
?>

Zunächst wird eine Variable „$i“ mit dem Wert „1“ definiert. Diese wird jeweils am Ende der Schleife um 1 „$i++“ hochgezählt. So lange dieser Wert kleiner oder gleich „<=“ 10 ist, wird die Schleife durchlaufen – insgesamt also 10 mal. Innerhalb der Schleife wird jeweils ein Block mit Radiobuttons mit dem Namen „antwort[$i]“ erzeugt. Wird das Formular später abgeschickt, wird das Array „$antwort“ mit genau zehn Einträgen an den Server übermittelt.

Sehr selten kommt beim Programmieren der Fall auf, dass eine Schleife, ganz gleich, ob eine vorgegebene Bedingung erfüllt ist oder nicht, mindestens einmal durchlaufen werden soll. Das kann mit einer „do … while“-Schleife erreicht werden. Angenommen der Nutzer bekommt auf der Webseite die Möglichkeit, eine Datenbank zu durchsuchen. Auf seinen Suchbegriff hin kann die Datenbank ein, mehrere oder gar kein Resultat liefern. Eine Antwort soll der Nutzer jedoch auf jeden Fall erhalten. Eine Schleife könnte dann so aussehen:

<?php
$anzahl = 0;
$suchergebnis[0] = „“;
$zaehlen = $anzahl;
do {
echo „Ergebnis $zaehlen von insgesamt $anzahl Resultaten.“;
if (!empty ($suchergebnis[$zaehlen])){
echo „<p>$suchergebnis[$zaehlen]</p>“;
}
$zaehlen–;
} while ($zaehlen > 0);
//gibt aus: Ergebnis 0 von insgesamt 0 Resultaten
?>

Im Beispiel hat die Datenbank gemeldet, dass es keine Suchergebnisse gibt ($anzahl = 0) und ein leeres Array ($suchergebnis) zurückgeliefert. Der Wert von $anzahl wird als $zaehlen gespeichert und später zum Herunterzählen ($zaehlen–) benutzt. Die „do … while“-Schleife gibt eine entsprechende Meldung über die Anzahl der Ergebnisse aus. Dann wird per Fallunterscheidung nachgeschaut, ob das Array-Element mit der gerade aktuellen Nummer ($zaehlen) einen Wert enthält. Wenn ja, wird der Wert ausgegeben. In unserem Fall gibt es jedoch keinen Wert, weswegen gleich zur nächsten Anweisung, die Variable „$zaehlen“ um 1 herunterzuzählen, gesprungen wird. Diese hat nun den Wert „-1“, der der abschließenden Überprüfung nicht standhält und die Schleife somit verlassen wird. Zugegeben, das Beispiel ist arg konstruiert und hätte anders einfacher gelöst werden können. Das kann jedoch als Beleg dafür dienen, wie selten man eine „do … while“-Schleife benötigt.

„for“-Schleife
Wenn eine Schleife eine bestimmte Anzahl von Durchläufen haben soll, ist „for“ die beste Alternative. Bei einer „for“-Schleife bekommt eine Variable einen Wert zugewiesen, der so lange hoch- beziehungsweise heruntergezählt wird, bis sie einen bestimmten Wert erreicht. Greifen wir noch einmal das Beispiel mit der Datenbankabfrage auf. Im folgenden Beispiel meldet die Datenbank drei Treffer ($anzahl) und diese werden in dem Array $suchergebnis zurückgegeben. Das Script gibt nun mit echo eine Standardmeldung über die Zahl der Treffer aus. Danach sollen die Suchergebnisse angezeigt werden.

<?php
$anzahl = 3;
$suchergebnis[0] = „Ergebnis 1“;
$suchergebnis[1] = „Ergebnis 2“;
$suchergebnis[2] = „Ergebnis 3“;
echo „<p>Ihre Suche ergab $anzahl Treffer.</p>“;

for ($i = 0; $i < $anzahl; $i++){
$nummer = $i + 1;
echo „Treffer $nummer: $suchergebnis[$i]<br>“;
}
//gibt aus: Ihre Suche ergab 3 Treffer.
//Treffer 1: Ergebnis 1
//Treffer 2: Ergebnis 2
//Treffer 3: Ergebnis 3
?>

Die Zahl der Durchläufe ist mit $anzahl gegeben. Die Schlüssel eines Arrays beginnen immer, sofern nicht anders definiert, bei 0. Daher legen wir den Startwert der Variablen $i in der for-Schleife auf 0 fest und können damit in jedem Durchlauf exakt das richtige Element des Arrays $suchergebnis ansprechen. Als nächstes wird mit $i < $anzahl die Zahl der Durchläufe festgelegt (von 0 bis < 3 ergibt drei Durchläufe). Mit „$i++“ definieren wir schließlich, dass $i mit jedem Durchlauf um 1 hochgezählt werden soll. Da das Array mit 0 beginnt, die natürliche Zählweise jedoch bei 1 und die Suchergebnisse durchnummeriert werden sollen, ist in der Schleife noch die Variable $nummer nötig, die immer um 1 höher ist als $i.

„foreach“
Um ein Array zu durchlaufen, insbesondere wenn die Anzahl der Elemente nicht bekannt ist, greift man am besten auf „foreach“ zu. Schauen wir uns noch mal das Beispiel mit der Umfrage und den Radiobuttons an. Die Ergebnisse hatten wir mit dem Array „$antwort“ an den Server zurückgegeben. Um die Werte des Arrays auszuwerten, nimmt man am einfachsten eine „foreach“-Schleife. Damit können sowohl der Schlüssel als auch der Wert eines jeden Elements der Reihe nach angesprochen werden. Im folgenden Beispiel sollen die Antworten ausgewertet werden.

<?php
$antwort[1] = 1;
$antwort[2] = 3;
$antwort[3] = 2;
//…
$antwort[10] = 2;

foreach ($antwort as $key => $value){
$ausgabe = „Frage $key wurde mit „;
switch ($value){
case 1:
$ausgabe = $ausgabe . „ja „;
break;
case 2:
$ausgabe = $ausgabe . „nein „;
break;
case 3:
$ausgabe = $ausgabe . „weiß nicht „;
break;
}
$ausgabe = $ausgabe . „beantwortet“;
echo „$ausgabe<br>“;
}
//gibt für $antwort[3] aus: Die Frage 3 wurde mit nein beantwortet
?>

Mit „foreach“ wird hier der Reihe nach von jedem Element der Schlüssel als „$key“ (Schlüssel bezeichnet man die Zahl oder der String in den eckigen Klammern) und sein Wert als „$value“ eingelesen. Mit diesen Variablen wird in der Schleife weitergearbeitet. Dann wird ein Ausgabetext ($ausgabe) definiert, der bei allen Durchläufen gleich ist. Dieser wird, je nach eintretendem Wert, der über die „switch/case“- Unterscheidung ermittelt wird, erweitert. Zum Schluss wird der Ausgabetext noch komplettiert und über „echo“ ausgegeben.