Unterschiede

Hier werden die Unterschiede zwischen zwei Versionen angezeigt.

Link zu dieser Vergleichsansicht

Nächste ÜberarbeitungBeide Seiten der Revision
de:create:filter-boolean [04.10.2011 21:54] – angelegt adminde:create:filter-boolean [11.11.2014 23:10] – Aktualisierung admin
Zeile 1: Zeile 1:
 ====== Mehrere Bedingungen verknüpfen ====== ====== Mehrere Bedingungen verknüpfen ======
  
-Falls mehrere Bedingungen verknüpft werden müssen, helfen so genannte logische Operatoren weiterBesonders wichtig sind hier der UND-Operator (**and** bzw. **&&**), der besagt, dass jede Bedingung erfüllt sein muss und der ODER-Operator (**or** bzw. **||**), der besagt, dass mindestens eine Bedingung erfüllt sein muss.+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ähltaber 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, sauch [[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üftob beide Bedingungen erfüllt sind. 
 +  * Der ODER-Operator (''or'' bzw. ''||''verknüpft ebenfalls zwei Bedingungen und überprüftob 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>
  
-**Wichtig:** Sie können mit den Operatoren nur Bedingungen verknüpfen, nicht direkt die Werte. Der Ausdruck ''1 or 2'' wird zwar keinen Fehler liefern, aber auch __nicht__ das gewünschte Ergebnis. Also lesen Sie bitte noch ein wenig weiter! 
  
 ===== Bedingungen mit UND verknüpfen ===== ===== Bedingungen mit UND verknüpfen =====
  
-Angenommen, der Benutzer soll -- wenn er einen Computer hat (TF02_01 hat den Wert 2, vgl. Abbildung) und wenn er ein Handy besitzt (TF02_03 hat ebenfalls den Wert 2) gefragt werden, ob er schon einmal Bilder, Klingeltöne, etc. vom Handy auf den Computer übertragen hat.+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}} {{scr.filters.example_checkbox.png?nolink|Beispiel für eine Mehrfachauswahl als Filterfrage}}
  
-In diesem Fall müssten folgende beide Bedingungen beide erfüllt sein:+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>
  
-  * ''value('TF02_01'== 2'' +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.
-  * ''value('TF02_03'== 2''+
  
-Im Filter wird das wie folgt abgebildet:+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> <code php>
Zeile 24: Zeile 49:
 </code> </code>
  
-Zur Sicherheit wurden beide Einzel-Bedingungen hier nochmal in runde Klammern gesetzt. In diesem Fall wäre das nicht notwendig, weil das ''%%==%%'' vor dem ''and'' ausgeführt wird (ähnlich wie beim "normalen" Rechnen Punkt vor Strich). Aber mit den Klammern geht man auch bei komplizierteren Konstruktionen auf Nummer sicher. +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:
- +
-Wenn die Klammer-Struktur nicht mehr übersichtlich ist, kann man auch problemlos mehrere Zeilen verwenden. Folgender Code hat exakt dieselbe Funktion wie das Beispiel oben:+
  
 <code php> <code php>
Zeile 38: Zeile 61:
  
 Spätestens, wenn mehr als zwei Bedingungen verknüpft werden sollen, bieten Einrückungen Übersichtlichkeit -- und vermeiden dadurch Fehler. 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 ===== ===== Die eine ODER andere Bedingung erfüllt =====
  
-Folgendes Beispiel zeigt eine Überprüfung, ob mindestens ein Item aus der oben dargestellten Frage angekreuzt wurde. Dafür kommt der Operator ''or'' zum Einsatz. Falls keine der Teilbedingungen zutrifft, springt der Fragebogen zum Ende.+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> <code php>
Zeile 47: Zeile 71:
   (value('TF02_01') == 2) or   (value('TF02_01') == 2) or
   (value('TF02_02') == 2) or   (value('TF02_02') == 2) or
-  (value('TF02_03') == 2) or +  (value('TF02_03') == 2)
-  (value('TF02_04') == 2)+
 ) { ) {
-  html('<p>Es wurde mindestens eines ausgewählt!</p>');+  // Einen Text auf dem Bildschirm anzeigen 
 +  html('<p>Es wurde mindestens eine der drei Optionen ausgewählt!</p>');
 } else { } else {
-  // Keins ausgewählt: Befragung beenden+  // Keines ausgewählt: Befragung beenden
   goToPage('end');   goToPage('end');
 } }
Zeile 58: Zeile 82:
  
 **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]]. **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 ===== ===== Prüfen ob eine Auswahl den einen ODER anderen Wert hat =====
Zeile 92: Zeile 117:
 </code> </code>
  
-Eine Alternative für eine größere Anzahl von Werten bieten Arrays in Verbindung mit der Funktion ''in_array()''.+Eine Alternative für eine größere Anzahl von Werten bieten [[array|Arrays]] in Verbindung mit der PHP-eigenen Funktion ''in_array()''.
  
 <code php> <code php>
 if (in_array(value('AB01'), array(1,2,3))) { if (in_array(value('AB01'), array(1,2,3))) {
   question('BB02');   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> </code>
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