Unterschiede

Hier werden die Unterschiede zwischen zwei Versionen angezeigt.

Link zu dieser Vergleichsansicht

de:create:filter-boolean [04.10.2011 21:54]
admin angelegt
de:create:filter-boolean [11.11.2014 23:10] (aktuell)
admin Aktualisierung
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: 11.11.2014 23:10 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