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');