LSpreee: IF, mehrere Bedingungen, weder - noch

Liebe Selfgemeinde,
google lässt sich für diese Frage schlecht verwenden und ich weiß doch, wie schnelle und jut hier die Antworten kommen.

Die Fragen drehen sich um "mehrere Bedingungen bei IF-Konstrukten", im Speziellen wenn es sich um verneinte Bedingungen.

Frage 1:
Nach einem opendir() durchgrast ein Code von mir den Ordner und soll auflisten, wenn es sich nicht um . oder .. handelt. Folgender Code funktioniert, obwohl ich was ganz anderes vermutet hätte:

  
if (($folders != ".") && ($folders != "..")){  
  //listen oder was...  
}

Ich hätte gedacht: Diese Bedingung ist gar nicht zu erfüllen, weil er nur ausführt, wenn $folder ungleich "." _und_ folder ungleich "..". Jedoch, der Code macht was er soll.

Frage 2:
Der Code soll ausführen, wenn weder mail_geo.txt noch mail_dgo.txt noch mail_reg.txt existieren.

  
if (!file_exists("./mail_geo.txt") && !file_exists("./mail_dgo.txt") && !file_exists("./mail_reg")){  
  //dann mach mal...  
}

Jedoch, er führt aus, auch wenn die Dateien existieren.

Irgendwas habe ich noch nicht an den UND-NICHT Bedingungen kapiert.

Bis gleich

  1. Hi there,
    auflisten, wenn es sich nicht um . oder .. handelt. Folgender Code funktioniert, obwohl ich was ganz anderes vermutet hätte:

    if (($folders != ".") && ($folders != "..")){
      //listen oder was...
    }

      
      
    Besser wäre  
      
    ~~~php
      
    if ($folders == ".") || $folders == "..")  
    {  
      continue;  
    }  
    else  
    {  
      //listen oder was...  
    }  
    
    

    if (!file_exists("./mail_geo.txt") && !file_exists("./mail_dgo.txt") && !file_exists("./mail_reg")){
      //dann mach mal...
    }

    
    >   
    > Jedoch, er führt aus, auch wenn die Dateien existieren.  
      
    Wird ausgeführt wenn keine der Dateien existiert. && (=UND-Verknüpfung) bedeutet, alle verknüpften Bedingungen müssen wahr sein.  
    Wenn Du meinst, soll ausgeführt werden, wenn auch nur eine der Dateien nicht existiert, benötigst Du eine || (=ODER-Verknüpfung)...  
      
    
    
    1. Danke schonmal für deine Antwort.

      Besser wäre

      if ($folders == ".") || $folders == "..")
      {
        continue;
      }
      else
      {
        //listen oder was...
      }

        
      Hatte ich auch erst, fand ich aber nicht so schön. Ich hatte versucht es zu verbessern.  
        
      
      > > ~~~php
        
      
      > > if (!file_exists("./mail_geo.txt") && !file_exists("./mail_dgo.txt") && !file_exists("./mail_reg")){  
      > >   //dann mach mal...  
      > > }
      
      

      Jedoch, er führt aus, auch wenn die Dateien existieren.

      Wird ausgeführt wenn keine der Dateien existiert. && (=UND-Verknüpfung) bedeutet, alle verknüpften Bedingungen müssen wahr sein.
      Wenn Du meinst, soll ausgeführt werden, wenn auch nur eine der Dateien nicht existiert, benötigst Du eine || (=ODER-Verknüpfung)...

      AHIAHIHIaiiiii: doch, ich meinte schon ersteres, und habe mich immer gewundert warum er ausführt, obwohl alle da waren. Jedoch nur auf den ersten Blick. Die Dateien existierten ohne Underscore.

      DAnke für die Bestätigung des 2. Codes. Ich bin jetzt mal richtig hintergestiegen. Hab nochmal die Kapitel im phpManual gelesen.
      Bis dann

      1. Hi,

        if ($folders == ".") || $folders == "..")
        {
          continue;
        }
        else
        {
          //listen oder was...
        }

        
        >   
        > Hatte ich auch erst, fand ich aber nicht so schön. Ich hatte versucht es zu verbessern.  
          
        Du kannst auch die ganze Bedingung negieren, dann sparst du dir den else-Zweig:  
          
        ~~~php
          
        if ( !($folders == ".") || $folders == "..") )  
        {  
           //listen oder was...  
         }  
        
        

        mfG,
        steckl

  2. echo $begrüßung;

    Die Fragen drehen sich um "mehrere Bedingungen bei IF-Konstrukten", im Speziellen wenn es sich um verneinte Bedingungen.

    Verneinte Bedingungen ist auch ein Thema, das ich nicht mag, weil es mir schwerfällt, sie auseinanderzuklamüsern.

    Nach einem opendir() durchgrast ein Code von mir den Ordner und soll auflisten, wenn es sich nicht um . oder .. handelt. Folgender Code funktioniert, obwohl ich was ganz anderes vermutet hätte:
    if (($folders != ".") && ($folders != "..")){
    Ich hätte gedacht: Diese Bedingung ist gar nicht zu erfüllen, weil er nur ausführt, wenn $folder ungleich "." _und_ folder ungleich "..". Jedoch, der Code macht was er soll.

    Ja, beides ist erfüllt, wenn weder . noch .. vorliegt. Die erste Bedingung trifft auf alles zu, was nicht . ist, also auch auf .. Die zweite Bedingung lässt alles durch, was nicht .. ist. Bei . bricht die Auswertung schon am ersten Teilausdruck mit negativem Ergebnis ab, weil dann das mit AND/&& verknüpfte Nachfolgende nicht mehr zutreffen kann (Kurzschluss-Verfahren).

    Um den ganzen Vorgang zu verstehen, hilft es mir, eine Wahrheitstabelle zu erstellen. Zunächst ohne Negierung.

    Wenn $folders == "." AND $folders == ".." dann
         -----------------+---------------------+-----------
                0         |          0          |
                0         |          1          |
                1         |          0          |
                1         |          1          |

    Das Ergebnis einer AND-Verknüpfung ist immer dann 1, wenn beide Operanden 1 sind. Also ergibt das dieses Ergebnis:

    Wenn $folders == "." AND $folders == ".." dann
         -----------------+---------------------+-----------
                0         |          0          |     0
                0         |          1          |     0
                1         |          0          |     0
                1         |          1          |     1

    Die zweite Zeile beispielsweise bedeutet, dass .. vorliegt, die dritte ist der .-Fall.

    Nun das Ganze mit negierten Ausgangswerten:

    Wenn $folders != "." AND $folders != ".." dann
         -----------------+---------------------+-----------
                1         |          1          |     1
                1         |          0          |     0
                0         |          1          |     0
                0         |          0          |     0

    Die Zeilen haben wieder die gleichen Bedeutungen wie die unnegierten Zeilen der ersten Tabelle, also die zweite ist immer noch der ..-Fall. "Negiert and negiert" heißt demzufolge im üblichen Sprachgebrauch "weder … noch …".

    Die jeweils vierte Zeile kann übrigens in freier Wildbahn nicht auftreten, weil $folders nicht . und .. zugleich sein kann. Ich führe sie nur der Vollständigkeit halber mit an.

    Im Zweifelsfall kann man alle vier (in dem Fall nur drei) Zustände zu Fuß durchexerzieren und mit Kontrollausgaben (var_dump()) der Ergebnisse der Teilausdrücke und des Gesamtausdrucks das Verhalten prüfen.

    Mit so einer Wahrheitstabelle kann man auch herausfinden, ob man AND oder OR (oder gar XOR) benötigt (und sei es auch nur zur Kontrolle des eigenen Gedankengangs, der zur (vorläufigen) Entscheidung für AND, OR oder XOR geführt hat). Man notiert sich die vier Konstellationen der Ausgangswerte und das gewünschte Ergebnis und ermittelt dann, welcher Verknüpfungsoperator passt.

    Frage 2:
    Der Code soll ausführen, wenn weder mail_geo.txt noch mail_dgo.txt noch mail_reg.txt existieren.
    if (!file_exists("./mail_geo.txt") && !file_exists("./mail_dgo.txt") && !file_exists("./mail_reg")){

    Die Wahrheitstabelle wird in dem Fall eine Spalte breiter und vier Zeilen länger, doch das Ergebnis ist prinzipiell gleich. Somit wäre die Logik richtig …

    Jedoch, er führt aus, auch wenn die Dateien existieren.

    … und die Kontrollausgaben der Teilausdrucksergebnisse müssten auf eine andere Ursache hinweisen.

    echo "$verabschiedung $name";