Schleifen und Wiederholungen

Schleifen mit while

Mit Hilfe von while definierst Du einen Anweisungsblock, der in Abhängigkeit von einer Bedingung mehrfach ausgeführt wird.

<?php
  $out=20;
  $count=0;
  while($count < $out)
  {
    echo "$count -mal die Schleife durchlaufen.";
    $count++;
  }
?>

Solange der Wert der Variable $count kleiner als 20 ($out) ist, wird der Anweisungsblock ausgeführt. Erst wenn der logische Ausdruck (nach while) die Bedingung FALSE(Falsch) ergibt, wird die Schleife nicht weiter ausgeführt. Im Beispiel ist dies der Fall, wenn die Variable $count den Wert 20 enthält.

Alternative Schreibweise der while-Schleife

PHP kennt für die while-Schleife eine alternative Schreibweise. Der Konstruktion mit if ähnlich, wird der Anweisungsblock durch einen Doppelpunkt eingeleitet. Das Ende wird durch endwhile markiert.

<?php
  $out=20;
  $count=0;
  while($count < $out):
    echo "$count -mal die Schleife durchlaufen.";
    $count++;
  endwhile;
?>

Die do-while-Schleife

Im Gegensatz zur while-Schleife wird hier die Austritts-Bedingung erst am Ende des Anweisungsblocks untersucht (und definiert). Das bedeutet, dass die Anweisungen mindestens einmal ausgeführt werden.

<?php
  $out=20;
  $count=0;
  do
  {
    echo "$count -mal die Schleife durchlaufen.";
    $count++;
  } while($count < $out)
?>

Durch do wird zuerst der Anweisungsteil durchlaufen. Danach wird die Bedingung die bei while definiert wurde geprüft. Von ihrem Wahrheitsgehalt ist ein erneutes Durchlaufen der Schleife abhängig.

Die for-Schleife

Die for-Schleife wird auch als Zählschleife bezeichnet. Im normalen Verwendungsfall wird durch

  • eine Zählvariable
  • die Bedingung und
  • die Veränderung des Zählers

eine Laufzeit ermittelt.

<?php
  for(Zählvariable(n); Bedingung(en); Anweisung(en)
  {
    Anweisungsblock
  }
?>

Ein einfaches Beispiel dient der Veranschaulichung:

<?php
  for($i = 0; $i <= 5; $i++)
  {
    echo "Die Schleife wird zum $i. Mal durchlaufen.<br />";
  }
?>

Diese Schleife wird fünfmal durchlaufen. Der Zählvariable $i wurde der Startwert 0 zugewiesen. Sie wird durch die Bedingung Überprüft. Solange die Bedingung zutrifft, wird die Zählvariable in dem Beispiel erhöht und der Anweisungsblock ausgeführt.

Diese Struktur ist nicht zwingend festgelegt, wie man schon oben lesen konnte. Denn auch mehrere Zählvariablen, Bedingungen und Zähler sind einfach möglich.

<?php
for($i = 0, $j = 10; $i < 8, $j > 4; $i++, $j--, print ("\$i ist $i / \$j ist $j")
{
  ?><br /><?php
}
?>

Ausgabe:

$i ist 2 / $j ist 9
$i ist 3 / $j ist 8
$i ist 4 / $j ist 7
$i ist 5 / $j ist 6
$i ist 6 / $j ist 5
$i ist 7 / $j ist 4

Hierdurch kann die Laufweite der Schleife deutlich beeinflusst werden.

Alternative Schreibweise der for-Schleife

Ähnlich der if-Konstruktion gibt es auch für die for-Schleife eine alternative Schreibweise:

<?php
  for($i = 0; $i <= 5; $i++):
    echo "Die Schleife wird zum $i. Mal durchlaufen.";
  endfor;
?>

Ausgabe:

Die Schleife wird zum 1. Mal durchlaufen.
Die Schleife wird zum 2. Mal durchlaufen.
Die Schleife wird zum 3. Mal durchlaufen.
Die Schleife wird zum 4. Mal durchlaufen.
Die Schleife wird zum 5. Mal durchlaufen.

Auch hier wird der Anweisungsblock mit einem Doppelpunkt eingeleitet. Der Ausstieg erfolgt durch die Anweisung endfor.

foreach, die Schleife der Arrays

Der Umgang mit Arrays erfährt durch die Anwendung dieses Schleifentyps eine deutliche Erleichterung. foreach arbeitet jedes Element des Arrays nacheinander ab. Dieser Schleifentyp ermittelt dabei die Anzahl der Elemente und setzt den internen Zeiger nach jedem Schleifendurchlauf um ein Element weiter. Dir stehen zwei Möglichkeiten zur Verfügung, die Schleife aufzurufen:

<?php
  $arrays = array("1", "2", "3", "4", "5");
  foreach($arrays as $element) // "as" erstellt eine neue Variable in welcher der aktuelle Wert    
  {                            // gespeichert ist.
    $element .= "0";
    echo $element.", ;
  }
?>

Ausgabe:

10, 20, 30, 40, 50,

Durch diese Schreibweise kann jedes Element des Arrays bearbeitet werden. Im Beispiel wird jeder Zahl des Arrays eine Null angehängt. Gleichzeitig werden die Elemente ausgegeben.
Soll auch der Schlüssel jedes Elements verarbeitet werden, verwendest Du folgende Syntax:

<?php
  $arrays = array("1", "2", "3", "4", "5");
  foreach($arrays as $key => $element) //$key speichert den Wert, $element den Schlüssel
  {
    $element .= "0";
    $key .= "x";
    echo "Schlüssel: $key; Element: $element<br />";
  }
?>

Ausgab:

Schlüssel: 0x; Element: 10
Schlüssel: 1x; Element: 20
Schlüssel: 2x; Element: 30
Schlüssel: 3x; Element: 40
Schlüssel: 4x; Element: 50

Jedes Element wurde genauso behandelt wie im vorhergehenden Beispiel. Hinzu gekommen ist die Bearbeitung des Schlüssels, an den das Zeichen x angehängt wird. Mehr über Arrays und den Einsatz von Schlüsseln (Keys) erfährst Du im Kapitel über Arrays.

Besonderheiten bei Schleifen

Ohne Klammern

Alle Anweisungen, die innerhalb der Schleife ausgeführt werden, fasst Du durch geschweifte Klammern zusammen. Soll aber nur eine Anweisung ausgeführt werden, können die Klammern weggelassen werden. Dasselbe gilt für if-Anweisungen.

Mit Klammern

<?php
  for($i = 0; $i <= 10; $i++)
  {
    echo "$i. Durchlauf";
  }
?>

Ohne Klammern

<?php
  for($i = 0; $i <= 10; $i++) echo "$i. Durchlauf<br />";
?>

Auch wenn es unbequem ist, die Klammern konsequent auch bei nur einer Anweisung zu schreiben, empfehle ich doch, die Klammern konsequent zu setzen, denn schnell möchte man weitere Anweisungen einfügen und schon schlägt der Code fehl oder noch schlimmer, er verhält sich anders als gewünscht. Dies kann man einfach verhindern, indem man die Klammern immer setzt.

Unvollständig

Innerhalb einer Schleife kannst Du den aktuellen Zyklos unterbrechen. Die Programmausführung fährt dann am Beginn der Schleife fort. In PHP verwendest Du dafür Continue:

<?php
 for($i = 3; $i >= -3; $i -= 1)
  {
    echo "\$i hat den Wert ".$i.";<br />";
    if($i == 0) continue; // Verhindern, dass durch 0 geteilt wird -> mit dem nächsten Durchlauf beginnen
    echo "100/\$i ergibt ".(100/$i)."<br />";
  }
?>

In diesem Beispiel zählt die Schleife von +3 bis -3. Hat $i den Wert 0, wird der Schleifendurchlauf unterbrochen und am Anfang wieder fortgesetzt.
Ausgabe:

$i hat den Wert 3
100/$i ergibt 33.333333
$i hat den Wert 2
100/$i ergibt 50
$i hat den Wert 1
100/$i ergibt 100
$i hat den Wert 0
$i hat den Wert -1
100/$i ergibt -100
$i hat den Wert -2
100/$i ergibt -50
$i hat den Wert -3
100/$i ergibt -33.333333

Abbruch

Während continue die Schleifenausführung unterbricht und am Beginn fortsetzt, eignet sich break, um den Schleifendurchlauf vorzeitig zu beenden, auch wenn die Abbruchbedingung nicht zutrifft.

<?php
  $i = 1;
  while($i < 10)
  {
    echo "\$i hat den Wert $i <br />";
    $i++;
    break;
    echo "Ich werde niemals angezeigt..";
  }
?>

Ausgabe:

$i hat den Wert 1


Nachdem wir nun das Grundgerüst zusammen haben, können wir uns ans Programmieren machen. Wir kennen die verschiedenen Variablentypen, dazu Bedingungen und Schleifen. Nun geht es im nächsten Kapitel darum, eigene Codeblöcke zu bilden durch Einsatz von Funktionen.