Übersetzungen dieser Seite:
 

Mehrere Bedingungen verknüpfen

Eventuell müssen für einen Filter (Filterfragen und Filter) mehrere Bedingungen verknüpft werden. Einige Beispiele für solche Verknüpfungen:

  • Hat der Befragte die Option „eher unwichtig“ (2) oder „eher wichtig“ (3) ausgewählt, aber nicht „vollkommen unwichtig“ (1) oder „besonders wichtig“ (4)?
  • Hat der Befragte angegeben, ein Auto zu besitzen und handelt es sich dabei um einen Benziner?
  • Nutzt der Befragte weder Nachrichten im Fernsehen noch in der Zeitung?
  • Kauft der Teilnehmer – laut einer Mehrfachauswahl – üblicherweise Schokolade und Milchprodukte?

Bei der Verknüpfung helfen so genannte „logische Operatoren“ (auch „Bool'sche Operatoren“ genannt, s. auch PHP: Logische Operatoren). Drei Operatoren benötigt man besonders häufig:

  • Der UND-Operator (and bzw. &&) verknüpft zwei Bedingungen und überprüft, ob beide Bedingungen erfüllt sind.
  • Der ODER-Operator (or bzw. ||) verknüpft ebenfalls zwei Bedingungen und überprüft, ob mindestens eine der Bedingungen erfüllt ist.
  • Der NOT-Operator (not bzw. !) wird einer Bedingung vorangestellt. Er überprüft, ob diese Bedingung nicht erfüllt ist.

Wichtig: Sie können mit den Operatoren nur Bedingungen verknüpfen, nicht direkt die Werte:

(value('AB01') == 1 || 2)  // Liefert zwar keinen Fehler, aber auch nicht das gewünschte Ergebnis
(value('AB01') == 1) || (value('AB01') == 2)  // Korrekte Verknüpfung von zwei Bedingungen

Bedingungen mit UND verknüpfen

Angenommen, der Benutzer soll gefragt werden, ob er schon einmal Bilder, Klingeltöne, etc. vom Handy auf den Computer übertragen hat. Aber nur dann, wenn er sowohl einen Computer als auch ein Handy besitzt. Der Besitz wird in einer Mehrfachauswahl „TF02“ abgefragt. Angekreuzte Optionen in einer Mehrfachauswahl erhalten den Code 2, nicht angekreuzte den Code 1.

Beispiel für eine Mehrfachauswahl als Filterfrage

Die einzelnen Bedingungen würden wie folgt überprüft:

  • value('TF02_01') == 2 (Besitz eines Computers)
  • value('TF02_03') == 2 (Besitz eines Handys)

Zwischen diese beiden Bedingungen wird nun ein and gesetzt. Damit es übersichtlich bleibt, kann man die Bedingungen nochmal in Klammern setzen:

(value('TF02_01') == 2) && (value('TF02_03') == 2)

In diesem Fall wären die inneren Klammern nicht notwendig, weil das == vor dem && ausgeführt wird (ähnlich wie beim Punkt-vor-Strich Rechnen). Aber mit den Klammern geht man auch bei komplizierteren Konstruktionen auf Nummer sicher.

Im IF-Filter steht die gesamte Bedingung nochmals in runden Klammern (denn die Bedingung bei der IF-Konstruktion steht immer in Klammern). Ein Filter mit der verknüpften Bedingung sie also aus wie folgt:

if ((value('TF02_01') == 2) && (value('TF02_03') == 2)) {
  question('IN20');  // Datenübertragung Handy-Computer
}

Wenn die Klammer-Struktur einmal nicht mehr übersichtlich ist, kann man auch problemlos mehrere Zeilen verwenden. Folgender PHP-Code hat exakt dieselbe Funktion wie das Beispiel oben:

if (
  (value('TF02_01') == 2) &&
  (value('TF02_03') == 2)
) {
  question('IN20');  // Datenübertragung Handy-Computer
}

Spätestens, wenn mehr als zwei Bedingungen verknüpft werden sollen, bieten Einrückungen Übersichtlichkeit – und vermeiden dadurch Fehler.

Die eine ODER andere Bedingung erfüllt

Folgendes Beispiel zeigt eine Überprüfung, ob mindestens eines der ersten drei Items aus der oben dargestellten Frage angekreuzt wurde (Besitz von Computer, DSL-Anschluss oder Handy). Dafür kommt der Operator || zum Einsatz, das logische ODER. Falls keine der Teilbedingungen zutrifft, springt der Fragebogen zum Ende.

if (
  (value('TF02_01') == 2) ||
  (value('TF02_02') == 2) ||
  (value('TF02_03') == 2)
) {
  // Einen Text auf dem Bildschirm anzeigen
  html('<p>Es wurde mindestens eine der drei Optionen ausgewählt!</p>');
} else {
  // Keines ausgewählt: Befragung beenden
  goToPage('end');
}

Tipp: Drei oder vier Items einer Frage kann man so noch abfragen. Aber sobald es mehr Items werden, gibt es eine elegantere Lösung. Diese wird vorgestellt in dem Kapitel Prüfen, ob mindestens ein Wert ausgewählt wurde.

Prüfen ob eine Auswahl den einen ODER anderen Wert hat

Häufig muss man überprüfen, ob in einer ganz normalen Auswahl oder für ein Skalenitem ein bestimmter Wertebereich ausgewählt wurde. Zum Beispiel ob der Wert 1, 2 oder 3 ausgewählt wurde.

Wenn die Werte direkt zusammenhängen, kann man mit den Vergleichsoperatoren größer als (>) und kleiner als (<) arbeiten.

if ((value('AB01') > 0) && (value('AB01') < 4)) {
  question('BB02');
}

Wenn die Werte nicht zusammenhängen, dann kann man jede Bedingung auch einzeln abfrage:

if (
  (value('AB01') == 1) ||
  (value('AB01') == 2) ||
  (value('AB01') == 3)
) {
  question('BB02');
}

Wenn man den PHP-Code übersichtlicher gestalten will, dann kann man den Wert zunächst in eine PHP-Variable speichern:

$a1 = value('AB01');
if (($a1 == 1) || ($a1 == 2) || ($a1 == 3)) {
  question('BB02');
}

Eine Alternative für eine größere Anzahl von Werten bieten Arrays in Verbindung mit der PHP-eigenen Funktion in_array().

if (in_array(value('AB01'), array(1,2,3))) {
  question('BB02');
}

Prüfung, ob eine Bedingung NICHT zutrifft

Mit dem NICHT-Operator (not bzw. !) lässt sich überprüfen, ob eine Bedingung nicht zutrifft. So könnte man den Befragten zum Ende des Fragebogens schicken, wenn er keinen Computer besitzt:

if (not (value('TF02_01') == 2)) {
  goToPage('end');
}

Allerdings wird für diesen Filter wohl eher der Ungleich-Vergleichsoperator (!=) eingesetzt werden:

if (value('TF02_01') != 2) {
  goToPage('end');
}

Und wenn man weiß, dass TF02_01 ohnehin nur die Werte 1 und 2 annehmen kann, ließe sich der Filter noch einfacher gestalten:

if (value('TF02_01') == 1) {
  goToPage('end');
}

Es gibt aber durchaus Fälle, in denen der NICHT-Operator hilfreich ist. In Anlehnung an das ODER-Beispiel von oben: Wenn der Befragte weder PC noch DSL-Anschluss oder Handy besitzt, soll er direkt ans Ende des Fragebogens geschickt werden:

if (!(
  (value('AB01') == 1) ||
  (value('AB01') == 2) ||
  (value('AB01') == 3)
)) {
  goToPage('end');
}

Der einzige Unterschied zum obigen ODER-Beispiel ist das Ausrufezeichen (!), welches Äquivalent zum not funktioniert, und die zusätzlichen Klammern am Anfang und am Ende.

Übrigens gibt es auch für das Rechnen mit dem NICHT-Operator ein mathematisches Distributivgesetz. Der folgende Filter hat denselben Effekt wie der vorhergehende:

if (
  (value('AB01') != 1) &&
  (value('AB01') != 2) &&
  (value('AB01') != 3)
) {
  goToPage('end');
}

Und natürlich kann man auch einfach den else-Teil der IF-Konstruktion verwenden:

if (
  (value('AB01') == 1) ||
  (value('AB01') == 2) ||
  (value('AB01') == 3)
) {
  // Nichts tun
} else {
  goToPage('end');
}

Verschachtelte Filter

Mitunter ist es sinnvoll, einen Filter in einen anderen Filter zu setzen. Nehmen wir die Situation, dass abhängig von der Antwort auf FF01 entweder die Frage FF02 oder FF03 angezeigt wurde. Und nun soll in Abhängigkeit von diesen beiden Fragen ein weiterer Filter anschließen. Die einzelnen Filter wären einfach:

if (value('FF02') == 1) {
  replace('%stimulus%', 'Hund');
} else {
  replace('%stimulus%', 'Katze');
}
if (value('FF03') == 1) {
  replace('%stimulus%', 'Wolf');
} else {
  replace('%stimulus%', 'Tiger');
}

Aber nun soll nur einer dieser beiden Filter aktiv werden … abhängig davon, welchen Wert FF01 hatte. Dafür werden diese Filter in einen weiteren Filter „hinein“ gesetzt.

if (value('FF01') == 1) {
  // Filter für FF02
  if (value('FF02') == 1) {
    replace('%stimulus%', 'Hund');
  } else {
    replace('%stimulus%', 'Katze');
  }
} else {
  // Filter für FF03
  if (value('FF03') == 1) {
    replace('%stimulus%', 'Wolf');
  } else {
    replace('%stimulus%', 'Tiger');
  }
}
de/create/filter-boolean.txt · Zuletzt geändert: 07.12.2023 07:01 von admin
 
Falls nicht anders bezeichnet, ist der Inhalt dieses Wikis unter der folgenden Lizenz veröffentlicht: CC Attribution-Share Alike 4.0 International
Driven by DokuWiki