Bernd: Status ausschließen

Hallo,

<?php if (
	$p_status != "6e623de7c366c92accd2b4a7ee49ad2a" OR
	$p_status != "602c5602d0a86003a925951b46a012b4" OR
	$p_status != "5555d1be56a4b410da755026783b4d9e" OR
	$p_status != "99ec7d6e86ea7540c6479c198aa1bf70" OR
	$p_status != "233d490e2c4c38f9ad47164316da1527" OR
	$p_status != "15d302ec8c7b23398aab3ad557699a31" OR
	$p_status != "cad62527260ce5310abd232ce98cb4a7"  ): ?>
<form></form>
~~~php
<?php endif ?>

wenn ich es richtig verstehe sage ich doch damit, wenn der Status nicht die oben genannten Nummern sind, dann soll das <form> angezeigt werden. Oder habe ich irgendwo ein Gedankenfehler?

  1. Ok, hab es jetzt so gemacht

    
    $nichtAnzeigen = array("6e623de7c366c92accd2b4a7ee49ad2a", 
                           "602c5602d0a86003a925951b46a012b4", 
                           "5555d1be56a4b410da755026783b4d9e", 
                           "99ec7d6e86ea7540c6479c198aa1bf70", 
                           "233d490e2c4c38f9ad47164316da1527", 
                           "15d302ec8c7b23398aab3ad557699a31", 
                           "cad62527260ce5310abd232ce98cb4a7");
    if (!in_array($p_status, $nichtAnzeigen)): ?>
    <form></form>
    <?php endif ?>
    

    Aber warum hat meine erste Variante nicht funktioniert?

    1. Hallo Bernd,

      Aber warum hat meine erste Variante nicht funktioniert?

      Weil du AND statt OR hättest nehmen müssen - eine der Bedingungen trifft ja immer zu da $p_status immer nur einen Wert haben kann.

      Gruß,
      Tobias

      1. Hallo,

        danke für die Info. Da habe ich mich mal wieder mit AND und OR täuschen lassen 😕 Kommt mwenn man etwas kopiert, denn ich habe auch folgende Ausgabe, die Funktioniert

        <?php if (
          $p_status == "6e623de7c366c92accd2b4a7ee49ad2a" OR
          $p_status == "602c5602d0a86003a925951b46a012b4" OR
          $p_status == "5555d1be56a4b410da755026783b4d9e" OR
          $p_status == "99ec7d6e86ea7540c6479c198aa1bf70" OR
          $p_status == "233d490e2c4c38f9ad47164316da1527" OR
          $p_status == "15d302ec8c7b23398aab3ad557699a31" OR
          $p_status == "cad62527260ce5310abd232ce98cb4a7" ):
        ?>
        disabled 
        <?php endif ?>>
        
        Gibt es vor oder Nachteile zu meinen beiden Varianten? Also zu !in_array und != 
        
        1. Hallo Bernd,

          die in_array Methode ist flexibler; du kannst die Liste der auszublendenden Status dann einfacher aus einer Datenquelle einsteuern.

          Wenn das nicht nötig ist, wenn Du sicher bist, dass es genau diese sieben sind und keine anderen, kannst Du auch den IF nehmen.

          Darf ich Dich übrigens mit Herrn De Morgan bekannt machen? Der hat zwei Regeln formuliert, die sich auf negierte logische Ausdrücke beziehen. Generationen von Programmierern haben schon über diese Regeln geflucht. Aber leider sind sie die Wahrheit.

          Seien A und B logische Werte (z.B. das Ergebnis einer Abfrage wie $x > 3). Der Strich obendrüber ist Theoretiker-Sprech für "NICHT".

          De Morgan Regel 1: $$\overline{A\ \mathrm{and}\ B} = \overline{A}\ \mathrm{or}\ \overline{B}$$
          De Morgan Regel 2: $$\overline{A\ \mathrm{or}\ B} = \overline{A}\ \mathrm{and}\ \overline{B}$$

          D.h. wenn ich zwei logische Werte AND oder OR verknüpfe und die ganze Bedingung negieren will, kann ich das so machen, dass ich die logischen Werte negiere (die Bedingung umdrehe) und dann AND mit OR tausche. Dieses Tauschen vergisst man gern.

          Beispiel in PHP:

          if ($a > 3 && $b > 4)
          {
             // tu nichts
          }
          else
          {
             // tu was
          }
          

          So ein Konstrukt ist blöd, weil nur im ELSE-Teil was passiert. Man möchte die Bedingung also gern umdrehen, um den ELSE zu sparen und den Code kompakter zu bekommen.

          if (!($a > 3 && $b > 4))
          {
             // tu was
          }
          

          Das ist immer noch blöd, wegen der doppelten Klammer und dem versteckten NOT-Ausrufezeichen vorn. Ich kann jetzt die De Morgan Regel 1 anwenden. Statt die ganze Bedingung zu negieren, negiere ich die Bedingungsteile und mache aus && ein ||. Das Negieren einer "Größer" Abfrage ist eine "Kleiner gleich" Abfrage:

          if ($a <= 3 || $b <= 4))
          {
             // tu was
          }
          

          So sieht das doch viel hübscher aus.

          Rolf

          --
          sumpsi - posui - clusi
    2. Hallo

      Aber warum hat meine erste Variante nicht funktioniert?

      Weil du den falschen Operator verwendet hast.

      $p_status != "6e623de7c366c92accd2b4a7ee49ad2a" OR // ...
      

      Damit eine Verknüpfung mit dem or-Operator true ergibt, reicht es, wenn einer der Operanden true ergibt. Wenn die erste Prüfung erfolgreich ist, also $p_status nicht dem Vergleichswert entspricht, dann ist also der gesamte Ausdruck true. – Da wird dann auch gar nicht weiter ausgewertet. EDIT: Ist der Teilausdruck hingegen false, weil die Werte übereinstimmen, dann wird der nächste Teilausdruck ausgewertet, der dann garantiert – so wie der ganze Ausdruck – zu true evaluiert. Das heißt, wie tk und Gunnar bereits geschrieben haben, ist die Gesamtbedingung immer wahr.

      Du sagst also nicht: „Wenn $p_status nicht den angegegeben Werten entspricht, mach was!“

      Du sagst: „Wenn einer der Werte nicht mit $p_status übereinstimmt, mach was!“

      Du wolltest sagen: „Wenn $p_status nicht mit diesem Wert übereinstimmt und $p_status nicht mit diesem Wert übereinstimmt und so weiter und so fort.“ – also:

      $p_status != "6e623de7c366c92accd2b4a7ee49ad2a" AND // ...
      

      Viele Grüße,

      Orlok

  2. @@Bernd

    Hallo,

    <?php if (
    	$p_status != "6e623de7c366c92accd2b4a7ee49ad2a" OR
    	$p_status != "602c5602d0a86003a925951b46a012b4" OR
    	$p_status != "5555d1be56a4b410da755026783b4d9e" OR
    	$p_status != "99ec7d6e86ea7540c6479c198aa1bf70" OR
    	$p_status != "233d490e2c4c38f9ad47164316da1527" OR
    	$p_status != "15d302ec8c7b23398aab3ad557699a31" OR
    	$p_status != "cad62527260ce5310abd232ce98cb4a7"  ): ?>
    <form></form>
    ~~~php
    <?php endif ?>
    

    wenn ich es richtig verstehe sage ich doch damit, wenn der Status nicht die oben genannten Nummern sind, dann soll das <form> angezeigt werden. Oder habe ich irgendwo ein Gedankenfehler?

    Ja, das hast du.

    Es gibt zwei Möglichkeiten:

    1. $p_status hat den Wert 6e623de7c366c92accd2b4a7ee49ad2a. Dann ist der erste Teil der Bedingung nicht erfüllt, aber der zweite Teil. Durch die OR-Verknüpfung ist die gesamte Bedingung erfüllt.

    2. $p_status hat einen anderen Wert. Dann ist der erste Teil der Bedingung erfüllt und durch die OR-Verknüpfung auch die gesamte Bedingung.

    Du hättest genauso if (TRUE) schreiben können, d.h. die Abfrage auch ganz weglassen können.

    LLAP 🖖

    --
    „Wer durch Wissen und Erfahrung der Klügere ist, der sollte nicht nachgeben. Und nicht aufgeben.“ —Kurt Weidemann
  3. Hallo Bernd,

    <?php if (
    	$p_status != "6e623de7c366c92accd2b4a7ee49ad2a" OR
    	$p_status != "602c5602d0a86003a925951b46a012b4" OR
    	$p_status != "5555d1be56a4b410da755026783b4d9e" OR
    	$p_status != "99ec7d6e86ea7540c6479c198aa1bf70" OR
    	$p_status != "233d490e2c4c38f9ad47164316da1527" OR
    	$p_status != "15d302ec8c7b23398aab3ad557699a31" OR
    	$p_status != "cad62527260ce5310abd232ce98cb4a7"  ): ?>
    <form></form>
    <?php endif ?>
    

    wenn ich es richtig verstehe sage ich doch damit, wenn der Status nicht die oben genannten Nummern sind, dann soll das <form> angezeigt werden. Oder habe ich irgendwo ein Gedankenfehler?

    das tatsächliche Ergebnis des obigen Ausdrucks ist ja schon mehrfach hier beschrieben worden, ebenso die Lösung des Problems, aber ich wollte noch einmal auf das klare if (true) welches Gunnar beschreibt zurückkommen:

    Gemäß der Booleschen Algebra kannst du in obigem Ausdruck die Negation ausklammern, d.h. folgender Ausdruck ist äquivalent:

    if (! (
        $p_status === "6e623de7c366c92accd2b4a7ee49ad2a" AND
     	  $p_status === "602c5602d0a86003a925951b46a012b4" AND
     	  $p_status === "5555d1be56a4b410da755026783b4d9e" AND
     	  $p_status === "99ec7d6e86ea7540c6479c198aa1bf70" AND
     	  $p_status === "233d490e2c4c38f9ad47164316da1527" AND
       	$p_status === "15d302ec8c7b23398aab3ad557699a31" AND
     	  $p_status === "cad62527260ce5310abd232ce98cb4a7"))
    {
        // …
    }
    

    Es ist offensichtlich, dass die innere Klammer, also die ganzen UND-Verknüpfungen nie erfüllt sein können – der Status kann ja nicht alle verschiedenen Werte gleichzeitig haben –, dementsprechend ist die Negation davon immer wahr.

    Viele Grüße
    Robert