====== 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:

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


===== 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:

<code php>
(value('TF02_01') == 2) and (value('TF02_03') == 2)
</code>

In diesem Fall wären die inneren Klammern nicht notwendig, weil das ''%%==%%'' vor dem ''and'' 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:

<code php>
if ((value('TF02_01') == 2) and (value('TF02_03') == 2)) {
  question('IN20');  // Datenübertragung Handy-Computer
}
</code>

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:

<code php>
if (
  (value('TF02_01') == 2) and
  (value('TF02_03') == 2)
) {
  question('IN20');  // Datenübertragung Handy-Computer
}
</code>

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 ''or'' zum Einsatz. Falls keine der Teilbedingungen zutrifft, springt der Fragebogen zum Ende.

<code php>
if (
  (value('TF02_01') == 2) or
  (value('TF02_02') == 2) or
  (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');
}
</code>

**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.

<code php>
if ((value('AB01') > 0) and (value('AB01') < 4)) {
  question('BB02');
}
</code>

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

<code php>
if (
  (value('AB01') == 1) or
  (value('AB01') == 2) or
  (value('AB01') == 3)
) {
  question('BB02');
}
</code>

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

<code php>
$a1 = value('AB01');
if (($a1 == 1) or ($a1 == 2) or ($a1 == 3)) {
  question('BB02');
}
</code>

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

<code php>
if (in_array(value('AB01'), array(1,2,3))) {
  question('BB02');
}
</code>


===== 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:

<code php>
if (not (value('TF02_01') == 2)) {
  goToPage('end');
}
</code>

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

<code php>
if (value('TF02_01') != 2) {
  goToPage('end');
}
</code>

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

<code php>
if (value('TF02_01') == 1) {
  goToPage('end');
}
</code>

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:

<code php>
if (!(
  (value('AB01') == 1) or
  (value('AB01') == 2) or
  (value('AB01') == 3)
)) {
  goToPage('end');
}
</code>

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:

<code php>
if (
  (value('AB01') != 1) and
  (value('AB01') != 2) and
  (value('AB01') != 3)
) {
  goToPage('end');
}
</code>

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

<code php>
if (
  (value('AB01') == 1) or
  (value('AB01') == 2) or
  (value('AB01') == 3)
) {
  // Nichts tun
} else {
  goToPage('end');
}
</code>