anja: Mehrere elseif Bedingungen, ist das möglich?

Hallo,
ich hab ein kleines Script geschrieben, das so aussieht:

<?php

if (file_exists("filename"))
{
echo "<img src="bild1.jpg">";
}

elseif (file_exists("filename2"))
{
echo "<img src="bild2.jpg">";
}

elseif (file_exists("filename3"))
{
echo "<img src="bild3.jpg">";
}

else
{
echo "<img src="bild4.jpg">";
}

?>

Ich möchte also, dass wenn es Bild 1 gibt, Bild 1 angezeigt wird, wenn es Bild 1 nicht gibt, soll weiter gesucht werden und Bild 2 angezeigt werden, wenn es Bild 2 nicht gibt, dann Bild 3 und wenn keins der Bilder vorhanden ist, soll Bild 4 angezeigt werden.

Leider hört das Script bei Bild 2 auf zu suchen und führt das Suchen von Bild 3 nicht mehr aus. Was ist an dem Code falsch? Man darf doch mehrere elseif Bedingungen haben oder?

Kann man das auch mit switch und case lösen? Ich habe überall nach der file_exists für case gesucht, aber nirgendwo gefunden.

Vielen Dank für eure Hilfe!

  1. Kann man das auch mit switch und case lösen? Ich habe überall nach der file_exists für case gesucht, aber nirgendwo gefunden.

    in deinem fall ist eine switch-verzweigung die bessere lösung - die bedingung selbst spielt keine rolle

    1. Kann ich das denn etwa so schreiben?

      <?php

      switch ($difres) {
       case file_exists("bild1.jpg"):
       echo "<img src="bild1.jpg">";
       break;

      case file_exists("bild2.jpg"):
       echo "<img src="bild2.jpg">";
       break;

      case file_exists("bild3.jpg"):
       echo "<img src="bild3.jpg">";
       break;

      default:
          echo "<img src="bild4.jpg">";
      }
      ?>

      Hab ich ausprobiert, funktioniert leider auch nicht. :\ Da hört die Suche schon beim ersten Bild auf.

      1. Hab ich ausprobiert, funktioniert leider auch nicht. :\ Da hört die Suche schon beim ersten Bild auf.

        lies bitte mal kurz nach, was break tut - wenns dann nicht funktioniert, sag bescheid http://at2.php.net/break

      2. Grüße,
        mein vorschlag:

          
        $bild="bild1.jpg";  
        $n=2;  
          
         while(file_exists($bild) AND $n<$nmax;){  
          echo "<img src=\"bild1.jpg\">";  
         $bild="bild".$n.".jpg";  
        $n++;  
        }  
          
        
        

        imho wesentlich flexibler und eleganter.
        MFG
        bleicher

        --
        __________________________-
        Menschen an sich , sind nicht schlecht - es sind nur ihre Taten (c).
        http://www.sexgott-or-not.com/?test=428054
        1. $bild="bild1.jpg";
          $n=2;

          while(file_exists($bild) AND $n<$nmax;){
            echo "<img src="bild1.jpg">";
          $bild="bild".$n.".jpg";
          $n++;
          }

          
          >   
          > imho wesentlich flexibler und eleganter.  
            
          funktioniert aber nur, wenn die bilder wirklich fortlaufend benannt sind  
            
          ansonsten könnte man aber alle bilder in ein array packen und mit foreach abarbeiten, wäre auch schöner - ausserdem ist die anzahl dann nach oben offen
          
          1. Ich glaube das Problem ist, dass ich nicht zweimal file_exists benutzen kann.
            Irgendwie reagiert das dumme Ding nicht. :\

            1. Grüße,

              Ich glaube das Problem ist, dass ich nicht zweimal file_exists benutzen kann.
              Irgendwie reagiert das dumme Ding nicht. :\

              habe öfters schleifenabfragen nach file_exists verwendet - gabs nie probleme.
              wie sieht dein aktueller versuch aus?

              MFG
              bleicher

              --
              __________________________-
              Menschen an sich , sind nicht schlecht - es sind nur ihre Taten (c).
              http://www.sexgott-or-not.com/?test=428054
            2. Ich glaube das Problem ist, dass ich nicht zweimal file_exists benutzen kann.
              Irgendwie reagiert das dumme Ding nicht. :\

              wie bleicher vorgeschlagen hat: eleganter, allerdings mit bilderarray und foreach-schleife

                
              $bilder = array('/bild1.jpg' => - 'erstes bild', '/anderesbild.jpg' => - 'anders bild', '/nocheinbild.jpg' => - 'noch eins');  
                
              foreach ($bilder as $src => $alt) {  
                if (file_exists($src)) {  
                  echo '<img src="' . $src . '" alt="' . $alt .'" />';  
                }  
              }  
              
              

              nicht getestet - alternativ kann man stat dem assoziativen array auch ein nummerisches nehmen, allerdings sind alt-texte ganz praktisch

              1. $bilder = array('/bild1.jpg' => - 'erstes bild', '/anderesbild.jpg' => - 'anders bild', '/nocheinbild.jpg' => - 'noch eins');

                foreach ($bilder as $src => $alt) {
                  if (file_exists($src)) {
                    echo '<img src="' . $src . '" alt="' . $alt .'" />';
                  }
                }

                  
                Nein, dieser Code ist funktionell nicht identisch mit anjas Beispiel. Es fehlt die Standardvorgabe für den Fall, dass kein Bild existiert.  
                
                
                1. Nein, dieser Code ist funktionell nicht identisch mit anjas Beispiel. Es fehlt die Standardvorgabe für den Fall, dass kein Bild existiert.

                  da hast du recht, hab ich wohl vergessen - aber das ist ja kein thema:

                    
                  if (!isset($bilder) || count($bilder) == 0) {  
                     echo '<img src="/bild4.jpg" alt="kein bild" />';  
                  }  
                  
                  
            3. echo $begrüßung;

              Ich glaube das Problem ist, dass ich nicht zweimal file_exists benutzen kann.
              Irgendwie reagiert das dumme Ding nicht. :\

              Versuch mal anstatt des Glaubens Kontrollausgaben zu verwenden. Z.B.

              var_dump(file_exists(...));

              Kontrollausgaben sind ein einfaches und effektives Mittel, um Verhalten und Variableninhalte zu überprüfen, und damit Fehlverhalten auf die Spur zu kommen.

              echo "$verabschiedung $name";

        2. @bleicher:
          Leider klappt dies nicht, weil die Bilder nicht gleich heißen. Das mit Bild 1,2,3... war nur ein Beispiel. Die Bildernamen werden durch Variablen übergeben und heißen ganz unterschiedlich. Aber danke für die Antwort.

          @suit:
          Okay, break heißt, dass die switch Anwendung unterbrochen werden soll, ich habe jetzt überall das break weggelassen, aber es funktioniert trotzdem nicht.

          HILFE!!!

  2. if (file_exists("filename"))
    {
    echo "<img src="bild1.jpg">";
    }

    elseif (file_exists("filename2"))
    {
    echo "<img src="bild2.jpg">";
    }

    Leider hört das Script bei Bild 2 auf zu suchen und führt das Suchen von Bild 3 nicht mehr aus. Was ist an dem Code falsch? Man darf doch mehrere elseif Bedingungen haben oder?

    Der Code ist richtig und du hast auch genau den richtigen Anwendungsfall für elseif gefunden. Das Problem muss eine andere Ursache haben.

    Was meinst du mit "hört auf zu suchen"? Wird immer Bild 2 ausgegeben? Wird überhaupt nichts ausgegeben? Wird Bild 4, jenes aus dem abschließenden else-Block, ausgegeben?
    Beachte, dass unter Unix-Derivaten, also auf den allermeisten Webservern, die Groß- und Kleinschreibung ein Unterscheidungsmerkmal ist, anders als bei Windows; Bild1.jpg ist also eine andere Datei als bild1.jpg.

    Nur nebenbei zwei Anmerkungen zu deinem Stil:

    Sowas:

    echo "<img src="bild1.jpg">";

    lässt sich übersichtlicher folgendermaßen:

    echo '<img src="bild1.jpg">';

    Beginne nicht jede Zeile in der ersten Spalte, sondern rücke untergeordnete Blöcke ein:

    elseif (file_exists("filename2")) {
        echo "<img src="bild2.jpg">";
    }

    Du wirst sonst bei Skripten, die über mehr als zwei Dutzend Zeilen gehen, sehr schnell die Übersicht verlieren.

    Und noch eine Anmerkung zur grundsätzlichen Funktion:

    Ich kenne den tatsächlichen Umfang nicht, aber es ist unter Umständen günstiger, die Angelegenheit in einer Schleife zu erledigen:

      $bilder = Array("bild1.jpg", "bild2.jpg", "bild3.jpg");  
      
      foreach ($bilder as $bild) {  
          if (file_exists($bild)) {  
              break;  
          }  
      }  
      echo '<img src="' . $bild '">';
    

    Das ist nicht nur kürzer, du hast auch jede Funktionalität nur einmal im Code stehen. Sowas erweist sich immer dann als praktisch, wenn man später etwas ändern möchte. Bei einer Änderung der Dateiprüfung müsstest du in deinem elseif-Beispiel vier (oder noch mehr) Stellen ändern, in der Schleife nur eine. Entsprechend schneller ist es erledigt und vor allen Dingen entsprechend geringer ist die Fehleranfälligkeit.

    Kann man das auch mit switch und case lösen?

    Nein, und mich wundert doch sehr, dass suit das bejaht. switch prüft eine einzelnes Etwas auf verschiedene Werte, du prüfst hingegen verschiedene Dinge auf ihren Wert.

    1. echo '<img src="' . $bild '">';[/code]

      bitte das alt-attribut nicht unterschlagen - zudem verstehe ich das break in deiner foreach-schleife nicht - es sollen ja mehrere bilder ausgegen werden? in deinem beispiel würde nur eins ausgegeben werden

      1. zudem verstehe ich das break in deiner foreach-schleife nicht - es sollen ja mehrere bilder ausgegen werden?

        Nein, wie kommst du darauf? Wenn Anja mit einer if-Konstruktion arbeitet, kann es doch wohl kaum auf die Ausgabe mehrerer Bilder hinauslaufen.

        1. Nein, wie kommst du darauf? Wenn Anja mit einer if-Konstruktion arbeitet, kann es doch wohl kaum auf die Ausgabe mehrerer Bilder hinauslaufen.

          stimmt, hast du recht

    2. echo $begrüßung;

      Kleine Ergänzung, die aber zum eigentlichen Problem nichts beiträgt:

      switch prüft eine einzelnes Etwas auf verschiedene Werte, du prüfst hingegen verschiedene Dinge auf ihren Wert.

      Unter PHP kann man switch auch so anwenden:

      switch (true) {
          case $a == $b:
            ...
          case $x == $u:
            ...
          case $sinn == 42:
            ...
          case isset($bielefeld):
            ...
        }

      Ob sowas sinnvoll ist, kommt drauf an. Syntaktisch kann man so aber mit switch Verschiedenes auf Verschiedenes prüfen.

      echo "$verabschiedung $name";

      1. switch prüft eine einzelnes Etwas auf verschiedene Werte, du prüfst hingegen verschiedene Dinge auf ihren Wert.

        Unter PHP kann man switch auch so anwenden:

        switch (true) {
            case $a == $b:

        Oha. Tja. Was soll man dazu sagen. PHP halt :/

        1. Hi!

          Oha. Tja. Was soll man dazu sagen. PHP halt :/

          Kennst Du LUA?

          --
          "Sei froh dass du nen Virenscanner hast, der schlauer ist als du..."
           
        2. Hello,

          switch (true) {
              case $a == $b:

          Oha. Tja. Was soll man dazu sagen. PHP halt :/

          Sowas ähnliches gab es schon bei Turbo-Pascal für das Typecasten mit varianten Records :-)

          Ein harzliches Glückauf

          Tom vom Berg

          --
          Nur selber lernen macht schlau
          http://bergpost.annerschbarrich.de
    3. Moin,

      »» »» Kann man das auch mit switch und case lösen?
      »»
      »» Nein, und mich wundert doch sehr, dass suit das bejaht. switch prüft eine einzelnes Etwas auf verschiedene Werte, du prüfst hingegen verschiedene Dinge auf ihren Wert.
      »»

      Doch, das geht auch mit switch:

        
      switch (TRUE) {  
        case file_exists($bild1) :  
          //mach was  
        break;  
        case file_exists($bild2) :  
          //mach was anderes  
        break;  
      }  
      
      

      So kann man auch verschiedene Bedingungen im Switch abfragen, man muss nur auf TRUE prüfen. Hier mal die Kommentare lesen.

      mit freundlichen Grüßen
      Ulrich

      --
      Teiltransparente Bereiche
      selfcode: sh:| br:> ie:% mo:) va:) de:] zu:) fl:( ss:| ls:[
      um-fritz.de