====== Mehrere Bedingungen verknüpfen ====== Eventuell müssen für einen Filter ([[filters|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 [[http://php.net/manual/de/language.operators.logical.php|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. {{scr.filters.example_checkbox.png?nolink|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('

Es wurde mindestens eine der drei Optionen ausgewählt!

'); } 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 [[filter-itemcount|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 [[array|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'); } }