====== Bedingungen mit mehr als 2 Möglichkeiten ====== 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. ===== IF und ELSE verschachteln ===== Wenn-Dann-Sonst-Filter kann man beliebig fortsetzen: * __Wenn__ der Internetanschluss Analog oder ISDN ist, dann wird Frage 1 gestellt. * __Wenn nicht__, dann wird eine neue Bedingung geprüft: * __Wenn__ der Anschluss DSL ist, dann wird Frage 2 gestellt. * __Wenn nicht__, dann wird eine neue Bedingung geprüft... * Diese Reihe lässt sich beliebig fortsetzen. {{div.filter_elseif.data.png?nolink|Filterfrage mit 3 verschiedenen Antwortvorgaben}} 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('

Sie haben keine Antwort gegeben!

'); } } }
Solche verschachtelten Konstruktionen können sinnvoll sein -- aber im vorliegenden Fall funktioniert es auch übersichtlicher. ===== IF und ELSE fortsetzen ===== 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('

Sie haben keine Antwort gegeben!

'); }
===== ELSE + IF = ELSEIF ===== 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 ([[variables#php-variablen|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 } ===== SWITCH ===== 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('

Ungültige Antwort

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

Ungültige Antwort

'); } // Weitere Fragen, die alle gestellt bekommen question('BB01');