Buubel: Verzeichnis auslesen und in Array schreiben

Hallo!

Ich hab ein kleines Problem in PHP:

Für ein Gallerie-Scirpt will ich ein Verzeichnis auslesen und die Bilder in ein Array schreiben. Mit einer Schleife soll dann eine Tabelle erzeugt werden, in der die Bilder ausgegeben werden. Zur Zeit wird aber leider immer nur das letzte Bild des Arrays angezeigt:

  
$verzeichnis = "bilder/xyz/";  
  
$bilder = array();  
  
$dir = opendir($verzeichnis);  
while ($bild = readdir($dir)) if($bild != "." && $bild != "..") $bilder[] = "<img src=\"$verzeichnis$bild\">";  
closedir($dir);  
$anzahl = count($bilder)-1;  
  
for ($x = 0; $x < $anzahl; $x++) {  
$ausgabe = "<tr><td>$bilder[$x]</td></tr>";  
}  

Außerdem würde ich gern wissen, wie ich verhindern kann, das die von Win XP erzeugte Datei "Thumbs.db" nicht mit ausgelesen wird.

Danke schon mal im Vorraus!

Buubel

  1. Hellihello

    also im Grunde ist es richtig, ein Punkt vor _$ausgabe .=_ muss sein!

    nutze mal var_dump($variable) zur kontrolle.

    "besser":

      
    $verzeichnis = "bilder/xyz/";  
      
    $bilder = array();  
    $dir = opendir($verzeichnis);  
    while ($bild = readdir($dir)) {  
      if($bild != "." && $bild != ".." && $bild!="thumbs.db"){  
       $bilder[] = $bild;  
    closedir($dir);  
      
    foreach ($bilder as $dateiName) {  
    $ausgabe .= '<tr><td><img src="'.$dateiName.'"/></td></tr>";  
    }  
    
    

    frankx

    1. Hellihello

      so wohl noch "besser":

        
      $verzeichnis = "bilder/xyz/";  
        
       $bilder = array();  
       $dir = opendir($verzeichnis);  
       while ($bild = readdir($dir)) {  
         if($bild != "." && $bild != ".." && $bild!="thumbs.db"){  
          $bilder[] = $bild;  
         }  
       }  
      closedir($dir);  
        
      foreach ($bilder as $dateiName) {  
       $ausgabe .= '<tr><td><img src="'.$dateiName.'"/></td></tr>";  
      }  
      
      

      frankx

      1. Hallo,

        while ($bild = readdir($dir))

        bitte eigne Dir dringend folgene Vorgehensweise an:

        while(($bild=readdir($dir)!==false)

        Gruß aus Berlin!
        eddi

        1. Hallo!
          So viele Antworten, die musste ich erst mal alle kapieren! (-:
          Es geht jetzt, hab mich für die Variante von frankx entschieden:

            
          $bilder = array();  
           $dir = opendir($verzeichnis);  
           while ($bild = readdir($dir)) {  
             if($bild != "." && $bild != ".." && $bild!="Thumbs.db"){  
              $bilder[] = $bild;  
             }  
           }  
          closedir($dir);  
            
          foreach ($bilder as $dateiName) {  
           $ausgabe .= '<tr><td><img src="'.$dateiName.'"/></td></tr>";  
          }  
          
          

          while(($bild=readdir($dir)!==false)

          Was hat bedeutet das? Ist mit nicht ganz klar... Ist die verwendete Variante denn jetzt soweit in Ordnung?

          Und noch eine kurze Frage:
          Kann ich mit einer for-Schleife auch PHP-Code erzeugen, der dann im weiteren Verlauf des Sciptes noch benutzt wird?

          Schönen Abend noch Buubel

          1. Re:

            while ($bild = readdir($dir)) {
               if($bild != "." && $bild != ".." && $bild!="Thumbs.db"){
                $bilder[] = $bild;

            Prinzip nicht verstanden - 6! Setzen!

            while(($bild=readdir($dir)!==false)
            ...Ist die verwendete Variante denn jetzt soweit in Ordnung?

            Darüber klärt Dich dieser Thread auf: http://forum.de.selfhtml.org/archiv/2004/9/t89656/#m536375

            Kann ich mit einer for-Schleife auch PHP-Code erzeugen, der dann im weiteren Verlauf des Sciptes noch benutzt wird?

            Ja.

            Gruß aus Berlin!
            eddi

            1. Hi eddi!

              while ($bild = readdir($dir)) {
                 if($bild != "." && $bild != ".." && $bild!="Thumbs.db"){
                  $bilder[] = $bild;

              Prinzip nicht verstanden - 6! Setzen!

              Irgendwie echt noch nicht verstanden... Kannst du das "Prinzip" noch mal für einen PHP-Anfänger erläutern? Eigentlich funktioniert es ja...

              Darüber klärt Dich dieser Thread auf: http://forum.de.selfhtml.org/archiv/2004/9/t89656/#m536375

              Leider nicht, er vergrößert bloß noch mein Unversändnis! Wäre nett, wenn du auch das nochmal erklären könntest!

              der nichts mehr verstehende
              Buubel ((-:

              1. Hello,

                while ($bild = readdir($dir))

                Der Ausdruck in der äußeren Klammer gibt das Ergebnis der Zuweisung an das while-Konsrtukt

                Wen jetzt eine Datei '0' heißt, dann wird damit $bild diesen Wert aufnehmen und an while weitergeben. Da while aber nur die Ergebnisse logischer Vergleiche auswertet und PHP eine automatische Typumwandlung hat, wird der name '0' in den logischen Wert false tansformiert.

                Die Schleife würde also abbrechen, sowie eine Datei mit dem (unter Unix erlaubten) Namen '0' auftauchen würde. Wo diese Datei in der Kette der "findfirst"/"findnext" Dateinamen steht, ist dem Betriebssystem überlassen und nicht wirklich vorhersehbar. Es kann am Anfang der Kette, in der Mitte oder auch ganz am Ende sein. Oder eben gar nicht, wenn es eine solche Datei im Verzeich is nicht gibt.

                Der Vergleich

                while  ( ($bild = readdir($dir)) !== false )

                führt nun durch den Identitäts-Operator einen Vergleich von Wert _und_ Typ durch.
                False entspricht in PHP    '0' | 0 | ' ' | '' | false | NULL    wenn man nur den Wert vergleicht, aber der Typ stimmt nur dann überein, wenn eben auf beiden Seiten false steht.

                Harzliche Grüße vom Berg
                http://www.annerschbarrich.de

                Tom

                --
                Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen
                Nur selber lernen macht schlau

                1. Hallo Tom.

                  Die Schleife würde also abbrechen, sowie eine Datei mit dem (unter Unix erlaubten) Namen '0' auftauchen würde.

                  Auf Windows-Systemen sind Dateien mit solchen Namen doch auch erlaubt?
                  (Dass der Windows-Explorer zu dämlich ist, solche zu erstellen, ist eine andere Sache.)

                  Einen schönen Samstag noch.

                  Gruß, Ashura

                  --
                  sh:( fo:} ch:? rl:( br: n4:~ ie:{ mo:| va:) de:> zu:} fl:( ss:) ls:[ js:|
                  „It is required that HTML be a common language between all platforms. This implies no device-specific markup, or anything which requires control over fonts or colors, for example. This is in keeping with the SGML ideal.“
                  [HTML Design Constraints: Logical Markup]
                  1. Hello,

                    Die Schleife würde also abbrechen, sowie eine Datei mit dem (unter Unix erlaubten) Namen '0' auftauchen würde.

                    Auf Windows-Systemen sind Dateien mit solchen Namen doch auch erlaubt?
                    (Dass der Windows-Explorer zu dämlich ist, solche zu erstellen, ist eine andere Sache.)

                    Man kann unter Windows auch noch einen Dateinamen doppelt im Directory anlegen, da Windows immer noch FCB unterstützt. Anders bekommen die das nicht hin, ihre Direcrories umbenennen zu können :-((

                    Harzliche Grüße vom Berg
                    http://www.annerschbarrich.de

                    Tom

                    --
                    Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen
                    Nur selber lernen macht schlau

                    1. Hello,

                      Man kann unter Windows auch noch einen Dateinamen doppelt im Directory anlegen, da Windows immer noch FCB unterstützt. Anders bekommen die das nicht hin, ihre Direcrories umbenennen zu können :-((

                      Das gitl für das alte FAT32, das aber immer noch existiert.
                      Wie das bei NTFS ist, weiß ich allerdings nicht...

                      Harzliche Grüße vom Berg
                      http://www.annerschbarrich.de

                      Tom

                      --
                      Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen
                      Nur selber lernen macht schlau

                    2. Hallo Tom.

                      Man kann unter Windows auch noch einen Dateinamen doppelt im Directory anlegen, da Windows immer noch FCB unterstützt.

                      Was ist FCB?

                      Anders bekommen die das nicht hin, ihre Direcrories umbenennen zu können :-((

                      ?

                      Einen schönen Samstag noch.

                      Gruß, Ashura

                      --
                      sh:( fo:} ch:? rl:( br: n4:~ ie:{ mo:| va:) de:> zu:} fl:( ss:) ls:[ js:|
                      „It is required that HTML be a common language between all platforms. This implies no device-specific markup, or anything which requires control over fonts or colors, for example. This is in keeping with the SGML ideal.“
                      [HTML Design Constraints: Logical Markup]
                      1. Hallo Ingrid.

                        Man kann unter Windows auch noch einen Dateinamen doppelt im Directory anlegen, da Windows immer noch FCB unterstützt.

                        Was ist FCB?

                        OK, was es ist weiß ich nun.
                        Aber was hat ein Dateivergleichstool mit dem doppelten Nutzen eines Dateinamens zu tun?

                        Einen schönen Samstag noch.

                        Gruß, Ashura

                        --
                        sh:( fo:} ch:? rl:( br: n4:~ ie:{ mo:| va:) de:> zu:} fl:( ss:) ls:[ js:|
                        „It is required that HTML be a common language between all platforms. This implies no device-specific markup, or anything which requires control over fonts or colors, for example. This is in keeping with the SGML ideal.“
                        [HTML Design Constraints: Logical Markup]
                      2. Hello,

                        Man kann unter Windows auch noch einen Dateinamen doppelt im Directory anlegen, da Windows immer noch FCB unterstützt.

                        Was ist FCB?

                        File Control Block

                        Das ist die Methode, wie "früher" die Dateidaten zwischen Applikation und dem Betriebssystem ausgetauscht wurden, bevor in der Assemblerschicht auf OOP, also auf Handles umgestellt wurde.

                        Diese Methode ließ noch zu, in ein Directory einen Dateinamen zweimal aufzunehmen. Die nächste Applikationsschicht war dafür verantwortlich, dies zu verhindern.

                        Harzliche Grüße vom Berg
                        http://www.annerschbarrich.de

                        Tom

                        --
                        Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen
                        Nur selber lernen macht schlau

                2. Hallo Tom!

                  while  ( ($bild = readdir($dir)) !== false )

                  Danke, jetzt hab ich's kapiert!

                  Mfg Buubel

  2. Hello,

    $verzeichnis = "bilder/xyz/";   ## hier steckt eine fehlermöglichkeit, wenn der Pfad ohne

    ## abschließenden Slash angegeben wird!
                                      ## Das sollte in der Funktion erst geprüft werden

    -----------------------------------
    function get_picture_pathes($verzeichnis)
    {

    $_bilder = array();

    $dir = opendir($verzeichnis);

    if ($dir)
      {
        while (($bild = readdir($dir))!== false )
        {
          if(is_file($bild) and is_readable($bild))  ## zumindest zum Zeitpunkt des Auslesens :-)
          {
            $_bilder[] = "$verzeichnis$bild;
          }
        }
        closedir($dir);
      }
      else
      {
        ## Fehlerbehandlung
        return false;
      }
      return $_bilder;
    }
    ----------------------------------

    function make_picture_table($_bilder)
    {
      if (!is_array($_bilder)) { return false; } ## oder "<p class="meldung">keine Bilder da</p>"

    $ausgabe  = "<table class="pictab">\n";

    foreach ($_bilder as $key => $val)
      {
        $ausgabe .= "  <tr>\n";
        $ausgabe .= "    <td>" . raw_url_encode($val) . "</td>\n";
        $ausgabe .= "  </tr>\n";
      }

    $ausgabe .= "</table>\n";

    return $ausgabe;
    }

    Mit diesen beiden Funktionen kannst Du dann kontrolliert arbeiten.
    Die eine beschafft die Informationen und die andere verarbeitet sie zu einem Ausgabestring.
    Jede Funktion liefert Fehlerwerte...

    Ich habe es erstmal unkommentiert gelassen. Frag bitte, wenn etwas unklar ist.

    Harzliche Grüße vom Berg
    http://www.annerschbarrich.de

    Tom

    --
    Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen
    Nur selber lernen macht schlau

    1. Hello,

      Hello,

      $verzeichnis = "bilder/xyz/";   ## hier steckt eine fehlermöglichkeit, wenn der Pfad ohne
                                        ## abschließenden Slash angegeben wird!
                                        ## Das sollte in der Funktion erst geprüft werden


      function get_picture_pathes($verzeichnis)
      {

      $_bilder = array();

      $dir = opendir($verzeichnis);
        if ($dir)
        {
          while (($bild = readdir($dir))!== false )
          {
            if(is_file($bild) and is_readable($bild))  ## zumindest zum Zeitpunkt des Auslesens :-)
            {
              $_bilder[] = "$verzeichnis$bild;
            }
          }
          closedir($dir);
        }
        else
        {
          ## Fehlerbehandlung
          return false;
        }
        return $_bilder;
      }


      function make_picture_table($_bilder)
      {
        if (!is_array($_bilder)) { return false; } ## oder "<p class="meldung">keine Bilder da</p>"

      $ausgabe  = "<table class="pictab">\n";

      foreach ($_bilder as $key => $val)
        {
          $ausgabe .= "  <tr>\n";

      $ausgabe .= "    <td><img alt="" src="" . raw_url_encode($val) . ""></td>\n";

      $ausgabe .= "  </tr>\n";
        }

      $ausgabe .= "</table>\n";

      return $ausgabe;
      }

      Mit diesen beiden Funktionen kannst Du dann kontrolliert arbeiten.
      Die eine beschafft die Informationen und die andere verarbeitet sie zu einem Ausgabestring.
      Jede Funktion liefert Fehlerwerte...

      Ich habe es erstmal unkommentiert gelassen. Frag bitte, wenn etwas unklar ist.

      Harzliche Grüße vom Berg
      http://www.annerschbarrich.de

      Tom

      Harzliche Grüße vom Berg
      http://www.annerschbarrich.de

      Tom

      --
      Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen
      Nur selber lernen macht schlau

  3. Hallo,

    Für ein Gallerie-Scirpt will ich ein Verzeichnis auslesen und die Bilder in ein Array schreiben. Mit einer Schleife soll dann eine Tabelle erzeugt werden, in der die Bilder ausgegeben werden.

    Da bereits liegt ein Denkfehler vor. Du Speicherst Daten in einer while()-Schleife in ein Datenfeld (array), um sie dann in einer weiteren Schleife wieder auszugeben. Das ist doppelte arbeit und der PHP-Prozess braucht dafür unnötig Arbeitsspeicher, denn schon während des Auslesens aus dem Verzeichnis kannst Du den Verzeichnisinhalt vormatiert ausgeben. Ander sieht dies allerdings aus, wenn Du zusätzlich noch eine Sortierung nach Namen der einzelnen Dateien haben möchtest.

    Zunächst einmal zwei kleine Scripte, die äquivalent zueinander sind:

    // ab Version 5.x von PHP  
    $verz='bilder/xyz/';  
    $dir1=[link:http://de3.php.net/manual/de/function.scandir.php@title=scandir]($verz);  
      
    // Versionen < 5.x  
    $dir2=array();  
    $d=[link:http://de3.php.net/manual/de/function.opendir.php@title=opendir]($verz);  
    while(($bild=[link:http://de3.php.net/manual/de/function.readdir.php@title=readdir]($d))!==false)  
       $dir2[]=$bild;  
    [link:http://de3.php.net/manual/de/function.closedir.php@title=closedir]($d);  
    [link:http://de3.php.net/manual/de/function.sort.php@title=sort]($dir2);
    

    Nun zu Deinem Script:

    echo "<dir>";  
    $verz='bilder/xyz/';  
    $d=opendir($verz);  
    while(($bild=readdir($d))!==false)  
       if(!is_dir($verz.$bild) && $bild!="Thumbs.db")  
          echo '<li>'.$bild.'</li>';  
      
    closedir($d);  
    echo '</dir>'
    

    Semantisch besser wäre hier die Listung mit <dir> statt einer Tabelle.

    Gruß aus Berlin!
    eddi

    1. Hello,

      Da bereits liegt ein Denkfehler vor.

      Das sehe ich ganz anders!

      Die Trennung der Aufgaben benötigt zwar Speicherplatz, aber der ist heute nicht mehr so teuer, wie Arbeitszeit, die man bei verkorksten Knotenscripten verdaddeln muss, um einen Fehler zu suchen.

      Außerdem ermöglicht die saubere funktionale Auflösung eine gute Fehlerkontrolle und entsprechende Reaktionen darauf. Ich hasse Scripte, die an jeder beliebigen Stelle

      [...]  or die("ich kann nicht mehr");

      stehen haben.

      Harzliche Grüße vom Berg
      http://www.annerschbarrich.de

      Tom

      --
      Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen
      Nur selber lernen macht schlau

      1. Hallo,

        Da bereits liegt ein Denkfehler vor.

        Das sehe ich ganz anders! Die Trennung der Aufgaben benötigt zwar Speicherplatz, aber der ist heute nicht mehr so teuer, wie Arbeitszeit, die man bei verkorksten Knotenscripten verdaddeln muss, um einen Fehler zu suchen.

        es bleibt Dir unbenommen wie folg vorzugehen:

          
        // Variante 1  
        function gib_bilder_aus($verz){  
           echo "<dir>";  
           $verz='bilder/xyz/';  
           $d=opendir($verz);  
           while(($bild=readdir($d))!==false)  
             if(!is_dir($verz.$bild) && $bild!="Thumbs.db")  
                 echo '<li>'.$bild.'</li>';  
          
           closedir($d);  
           echo '</dir>'  
        }  
        // später in Der HTMLausgabe  
        <?php gib_bilder_aus('bilder/xyz/'); ?>  
          
        // Variante 2  
        $verz='bilder/xyz/';  
        $text="<dir>";  
        $verz='bilder/xyz/';  
        $d=opendir($verz);  
        while(($bild=readdir($d))!==false)  
           if(!is_dir($verz.$bild) && $bild!="Thumbs.db")  
              $text.='<li>'.$bild.'</li>';  
          
        closedir($d);  
        $text.='</dir>'  
          
        // später in Der HTMLausgabe  
        <?php echo $text; ?>
        

        Der Denkfehler -über ein Datenfeld gehen zu müssen- bleibt davon unberührt.

        Gruß aus Berlin!
        eddi

  4. Hallo Buubel.

    Für ein Gallerie-Scirpt will ich ein Verzeichnis auslesen und die Bilder in ein Array schreiben.

    Einmal abgesehen davon, dass es das Wort „Gallerie“ nicht gibt, frage ich mich, was gegen glob() spricht.

    Einen schönen Freitag noch.

    Gruß, Ashura

    --
    sh:( fo:} ch:? rl:( br: n4:~ ie:{ mo:| va:) de:> zu:} fl:( ss:) ls:[ js:|
    „It is required that HTML be a common language between all platforms. This implies no device-specific markup, or anything which requires control over fonts or colors, for example. This is in keeping with the SGML ideal.“
    [HTML Design Constraints: Logical Markup]
    1. Hellihello

      Einmal abgesehen davon, dass es das Wort „Gallerie“ nicht gibt,

      Das Wort "Scirpt" auch nicht. Wie gut, dass der menschliche Interpreter anpassungsfähig das Suchen nach unscharfen Suchmustern beherrscht.

      frankx

      1. Hallo frankx.

        Einmal abgesehen davon, dass es das Wort „Gallerie“ nicht gibt,

        Das Wort "Scirpt" auch nicht. Wie gut, dass der menschliche Interpreter anpassungsfähig das Suchen nach unscharfen Suchmustern beherrscht.

        Außer natürlich, er hat die Verarbeitung vorzeitig aufgrund eines Fehlers abgebrochen.

        Einen schönen Freitag noch.

        Gruß, Ashura

        --
        sh:( fo:} ch:? rl:( br: n4:~ ie:{ mo:| va:) de:> zu:} fl:( ss:) ls:[ js:|
        „It is required that HTML be a common language between all platforms. This implies no device-specific markup, or anything which requires control over fonts or colors, for example. This is in keeping with the SGML ideal.“
        [HTML Design Constraints: Logical Markup]