burghi'sphp-dummies.de
PHP für Einsteiger und Fortgeschrittenere - an laufenden Scripten erklärt
06.02.2012, 11:10 Uhr - Impressum

Tutorials - Erste Schritte - Bedingungen - switch

Tutorials - Erste Schritte
Bedingungen: switch
Als nächstes folgt ein Gebilde, das sich "switch" nennt.
Zu deutsch: eine Weiche.
Sie bietet eine übersichtliche Struktur wenn einmal sehr viele Möglichkeiten einer Varibalen voneinander abgegrenzt werden sollen.

Also, ein Beispiel mit "switch"-Weiche:
<?php     /* Wir sind jetzt Weichensteller im Frankfurter Hauptbahnhof und müssen Weichen stellen. */
//Dazu müssen wir erst mal wissen, wohin der Zug gehen soll.

$Ziel = "Hamburg";     /* Wir sagen, das Ziel sei Hamburg. */

switch ($Ziel) {     /* Die Variable Ziel soll durch die Weiche geschickt werden */
     case "Hamburg":     /* "im Falle von" "Hamburg": */
          echo "Der Zug fährt nach Norddeutschland";     /* ...wird dieses ausgeführt. */
}
?>
All das, was zu dem switch gehören soll, gehört ebenso wie bei den if's in eine geschweifte Klammer.
Nach den einzelnen "case"-Zeilen braucht man auch keine geschweiften Klammern (kann sie aber machen). Es werden sämtliche folgende Befehle ausgeführt...
<?php
$Herkunft = "Frankfurt a.M.";     /* eine weitere Variable */
$Ziel = "Hamburg";

switch ($Ziel) {
     case "Hamburg":
          echo "Der Zug fährt nach Norddeutschland";
          echo "<br />und er kommt aus " . $Herkunft . "<br />";     /* und ein weiterer Befehl, der im case "Hamburg" ausgeführt werden soll */
}
?>
...ausgeführt bis zu einem gewissen Wörtchen. Dieses lautet "break;"
Die Weiche wird verlassen.
<?php
$Herkunft = "Frankfurt a.M.";
$Ziel = "Hamburg";

switch ($Ziel) {
     case "Hamburg":
          echo "Der Zug fährt nach Norddeutschland";
          echo "<br />und er kommt aus " . $Herkunft . "<br />";
          break;     /* verlassen der Weiche */
}
?>
Dieses break ist aber erst von Wirkung, wenn weitere Fälle überprüft werden:
<?php
$Herkunft = "Frankfurt a.M.";
$Ziel = "Hamburg";

switch ($Ziel) {
     case "Hamburg":     /* case stimmt */
          echo "Der Zug fährt nach Norddeutschland";     /* wird ausgegeben */
          echo "<br />und er kommt aus " . $Herkunft . "<br />";     /* wird ausgegeben */
          break;     /* switch wird verlassen */
     case "München":     /* ( wird gar nicht mehr überprüft ) */
          echo "Der Zug fährt nach Süddeutschland";
          echo "<br />und er kommt aus " . $Herkunft . "<br />";
          break;
}     /* hier geht das Script weiter */
?>
Ohne break tut das Script folgendes:
<?php
$Herkunft = "Frankfurt a.M.";
$Ziel = "Hamburg";

switch ($Ziel) {
     case "Hamburg":     /* case stimmt */
          echo "Der Zug fährt nach Norddeutschland";     /* wird ausgegeben */
          echo "<br />und er kommt aus " . $Herkunft . "<br />";     /* wird ausgegeben */
// kein break-Befehl
     case "München":     /* diese Bedingung stimmt nicht, aber es wird durchlaufen, da Hamburg bereits stimmte... */
          echo "Der Zug fährt nach Süddeutschland";     /* wird ausgegeben */
          echo "<br />und er kommt aus " . $Herkunft . "<br />";     /* wird ausgegeben */
}
?>
Das Weglassen des breaks führt im Bahnhofsscript zu unerwünschten Ergebnissen.
Im folgenden Script hat das Weglassen aber einen gewissen Sinn:
<?php
$Tier = "Schmetterling";

switch ($Tier) {
     case "Fliege":
     case "Schmetterling":     /* hier wird in die Weiche eingestiegen */
// es folgen allerdings keine Befehle...     /* ... aber auch kein break, daher wird... */
     case "Ameise":
          echo "Das Tier ist ein Insekt";     /* dieses ausgegeben. */
          break;
}
?>
Und richtig, ein Schmetterling ist ein Insekt. Auf das selbe Ergebnis wären wir bei Fliege und Ameise auch gekommen. Lediglich der Einstieg in die Weiche wäre früher oder später geschehen.

Was aber wenn nun keines der Argumente stimmt ?

Die Weiche würde kein Ergebnis liefern.

Damit sie es doch tut, gibt es das Wörtchen default.
Es entspricht praktisch dem "else" der if-Bedingung:
<?php
$Tier = "Katze";     /* "Katze" wird in der Weiche nicht abgefragt */

switch ($Tier) {
     case "Elefant":
          echo "Ein " . $Tier . " ist größer als ein Pferd" . "<br />";
     case "Pferd":
          echo "Ein " . $Tier . " ist größer als ein Hund" . "<br />";
     case "Hund":
          echo "Ein " . $Tier . " ist größer als ein Kaninchen" . "<br />";
     case "Kaninchen":
          echo "Ein " . $Tier . " ist größer als ein Wurm" . "<br />";
     default:
          echo "Ein " . $Tier . " ist größer als ein Atom" . "<br />";     /* deswegen wird das "default" ausgeführt */
}
?>
<?php
$Tier = "Hund";     /* Bei case "Hund" wird in die Weiche eingestiegen */

switch ($Tier) {
     case "Elefant":
          echo "Ein " . $Tier . " ist größer als ein Pferd" . "<br />";
     case "Pferd":
          echo "Ein " . $Tier . " ist größer als ein Hund" . "<br />";
     case "Hund":
          echo "Ein " . $Tier . " ist größer als ein Kaninchen" . "<br />";
     case "Kaninchen":
          echo "Ein " . $Tier . " ist größer als ein Wurm" . "<br />";
     default:
          echo "Ein " . $Tier . " ist größer als ein Atom" . "<br />";
}
?>
Ein switch funktioniert natürlich auch mit Zahlen, allerdings kann man (leider) kein < oder > einbauen, sondern die Zahlenwerte nur direkt abfragen:
<?php
$Zahl = 3;

switch ($Zahl)
{
     case 5:
          echo "Die Zahl ist größer als 4" . "<br />";
     case 4:
          echo "Die Zahl ist größer als 3" . "<br />";
     case 3:
          echo "Die Zahl ist größer als 2" . "<br />";
     case 2:
          echo "Die Zahl ist größer als 1" . "<br />";
     case 1:
          echo "Die Zahl ist größer als 0" . "<br />";
          break;
     default:     /* vor dem default ein break, damit die Fehlermeldung nicht immer ausgegeben wird */
          echo "FEHLER: ungültige Zahl" . "<br />";
          break;
}
?>
© 2004-2005 - Impressum