Inhaltsverzeichnis

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:

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('<p>Sie haben keine Antwort gegeben!</p>');
    }
  }
}

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('<p>Sie haben keine Antwort gegeben!</p>');
}

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