Oft gibt es nicht nur zwei Möglichkeiten, wie es nach einem Filter weitergeht, sondern mehrere. Beispielsweise sollen Personen mit analogem Internet-Anschluss oder ISDN nach dem genutzten Tarif gefragt werden, DSL-Nutzer nach Geschwindigkeit und Anschlussanbieter. Personen mit einem anderen Anschluss bekommen Fragen zur Art des Kabels zwischen Computer und Wand.
Für solche Fälle können Sie zwei verschiedene Sprachkonstrukte verwenden: elseif
und switch
. Ersteres knüpft an die bekannte if-else-Konstruktion an, Zweiteres wird hier eher der Vollständigkeit halber erklärt. Das switch
ist mitunter etwas übersichtlicher, wenn mehrere Ausprägungen derselben Variable überprüft werden sollen.
Wenn-Dann-Sonst-Filter kann man beliebig fortsetzen:
Wenn man die Frage TF03 nach dem Internetanschluss auf Seite 1 gestellt hat, sieht der Filter auf Seite 2 im PHP-Code Element dann aus wie folgt:
if (value('TF03') == 1) { // Analog oder ISDN? question('IN15'); // Frage nach Tarif } else { // Im else-Teil steht (verschachtelt) ein neuer Filter if (value('TF03') == 2) { // DSL-Anschluss? question('IN16'); // Frage zum DSL-Anschluss } else { // Im else-Teil steht (verschachtelt) ein neuer Filter if (value('TF03') == 3) { // Sonstiger-Anschluss? question('IN17'); // Frage zum Kabel } else { html('<p>Sie haben keine Antwort gegeben!</p>'); } } }
Solche verschachtelten Konstruktionen können sinnvoll sein – aber im vorliegenden Fall funktioniert es auch übersichtlicher.
Folgende Konstruktion liefert genau dasselbe Ergebnis wie das vorhergehende Beispiel. Auch sie könnte beliebig fortgesetzt werden.
// Beispiel für else if - nicht verschachtelt if (value('TF03') == 1) { // Analog oder ISDN? question('IN15'); // Frage nach Tarif } else if (value('TF03') == 2) { // DSL-Anschluss? question('IN16'); // Frage zum DSL-Anschluss } else if (value('TF03') == 3) { // Sonstiger Anschluss? question('IN17'); // Frage zum Kabel } else { html('<p>Sie haben keine Antwort gegeben!</p>'); }
In PHP gibt es zur einfacheren Schreibweise den Befehl elseif
. Die Anweisung nach diesem Befehl wird dann ausgeführt, wenn die Bedingung nach elseif
erfüllt ist, aber keine vorhergehende. Praktisch ist elseif
nichts anderes als das else if
im obigen Beispiel.
// PHP-Code – Beispiel für elseif if (value('TF03') == 1) { // Analog oder ISDN? question('IN15'); // Frage nach Tarif } elseif (value('TF03') == 2) { // DSL-Anschluss? question('IN16'); // Frage zum DSL-Anschluss } else { // Keines der vorigen? // Die Prüfung der letzten Bedingung kann man sich sparen, // wenn für die Frage der Antwortzwang aktiviert wurde question('IN17'); // Frage zum Kabel }
Man kann den Wert von TF03 auch vorab in eine Variable (PHP-Variablen) speichern. Dadurch wird es nochmals übersichtlicher:
// Wert in Variable speichern $cn = value('TF03'); if ($cn == 1) { // Analog oder ISDN? question('IN15'); // Frage nach Tarif } elseif ($cn == 2) { // DSL-Anschluss? question('IN16'); // Frage zum DSL-Anschluss } else { // Keines der vorigen? question('IN17'); // Frage zum Kabel }
Falls wie im Beispiel nur verschiedene Ausprägungen einer Variable abgefragt werden sollen, ist es natürlich etwas umständlich, jedes mal das value('TF03')
anzuschreiben. Stattdessen gibt es in PHP die switch
-Konstruktion.
Dabei gibt man hinter dem switch
in Klammern an, welcher Wert überprüft werden soll. Hinter jeweils einem case
stehen dann die verschiedenen Möglichkeiten, gefolgt von einem Doppelpunkt.
Wichtig: Hinter den Befehle muss aber (im Gegensatz zur elseif
-Konstruktion) immer ein break
stehen – sonst wird alles ab dem case
ausgeführt.
switch (value('TF03')) { case 1: question('IN15'); // Frage nach Tarif break; case 2: question('IN16'); // Frage zum DSL-Anschluss break; case 3: question('IN17'); // Fragen zum Kabel break; default: // Default wird verwendet, wenn kein case zutrifft html('<p>Ungültige Antwort</p>'); break; // Das letzte break muss nicht sein } // Weitere Fragen, die alle gestellt bekommen question('BB01');
Natürlich lässt sich dies auch platzsparender schreiben:
switch (value('TF03')) { case 1: question('IN15'); break; // Frage nach Tarif case 2: question('IN16'); break; // Frage zum DSL-Anschluss case 3: question('IN17'); break; // Fragen zum Kabel default: html('<p>Ungültige Antwort</p>'); } // Weitere Fragen, die alle gestellt bekommen question('BB01');