Jochen: Script liest Verzeichnis falsch aus

Hi,

mit folgendem Script will ich meine Fotoalben für meine HP erstellen:

<?php

$bilderverzeichnis = opendir("ordner");

while($dateiname = readdir($bilderverzeichnis)){
if(eregi(".(jpg|gif|png)$",$dateiname)){
echo "            <div class="bild_mit_unterschrift">\n";
echo "            <p class="unterschrift_unter_bild"><a href="ordner/$dateiname" rel="lyteshow[album]" title="Albumname">";
echo "<img class="keinbilderrahmen" src="ordner/kl/$dateiname" alt=""/>";
echo "</a><br/>$dateiname</p>\n";
echo "            </div>\n\n";
}
}

closedir($bilderverzeichnis);

?>

Das Script soll das angegebene Verzeichnis auslesen und bei jedem Durchgang das "Thumbnail" des aktuell ausgelesenen Dateinamens (das im gleichen Ordner im Unterordner "kl" mit gleichem Namen steckt) darstellen und die große Ausgabe verlinken.

Das Script funktioniert auch soweit, nur werden die Bilder nicht "alphabetisch" oder "der Reihe nach" ausgelesen, sondern wild durcheinander.

Konkretes Beispiel:

Die Bilder liegen im Ordner folgendermaßen vor:

100_0001.jpg
100_0002.jpg
100_0003.jpg
:
:
100_0200.jpg

Das Ergebnis, wenn ich meine Bildergalerie mit diesem Script generieren lasse, sieht in der Reihenfolge so aus:

<div class="bild_mit_unterschrift">
<p class="unterschrift_unter_bild"><a href="ordner/100_0047.jpg" rel="lyteshow[album]" title="Albumname"><img class="keinbilderrahmen" src="ordner/kl/100_0047.jpg" alt=""/></a><br/>100_0047.jpg</p>
</div>

Ohne den generierten Code:

100_0047.jpg
100_0100.jpg
100_0001.jpg
100_0046.jpg
100_0101.jpg
100_0002.jpg
100_0048.jpg
100_0102.jpg
100_0003.jpg
:
:

Wie kann das denn möglich sein?
Das Script liest doch nur jedes Element des Ordners aus - warum fängt es dann nicht "alphabetisch" mit der kleinsten Zahl an?

LG

Jochen

  1. Hallo Jochen,

    100_0047.jpg
    100_0100.jpg
    100_0001.jpg

    [...]

    Wie kann das denn möglich sein?

    warum sollte es nicht möglich sein? Vermutlich stehen diese Dateien in dieser
    Reihenfolge im Verzeichnis.

    Das Script liest doch nur jedes Element des Ordners aus - warum fängt es dann nicht "alphabetisch" mit der kleinsten Zahl an?

    Warum sollte es?

    Lies bitte die Hinweise zu glob() - und verwende diese Funktion statt readdir().

    Freundliche Grüße

    Vinzenz

    1. n'abend,

      Lies bitte die Hinweise zu glob() - und verwende diese Funktion statt readdir().

      Mir entzieht sich die Begründung an dieser Stelle (das wesentlich langsamere) glob() einzusetzen. glob() ist in tiefer geschachtelten Strukturen nicht mehr zu gebrauchen, sollte der OP das irgendwann in Betracht ziehen.

      weiterhin schönen abend...

      --
      #selfhtml hat ein Forum?
      sh:( fo:# ch:# rl:| br:> n4:& ie:{ mo:} va:) de:] zu:} fl:( ss:? ls:[ js:|
      1. Hello,

        glob() ist in tiefer geschachtelten Strukturen nicht mehr zu gebrauchen, sollte der OP das irgendwann in Betracht ziehen.

        Kannst Du dazu noch ein bisschen mehr sagen?
        So "lose" ist die Aussage nicht viel wert.

        Harzliche Grüße aus
        Sankt Andreasberg
        und Frohes Neues Jahr

        Tom

        --
        Nur selber lernen macht schlau

        1. n'abend,

          glob() ist in tiefer geschachtelten Strukturen nicht mehr zu gebrauchen, sollte der OP das irgendwann in Betracht ziehen.

          Kannst Du dazu noch ein bisschen mehr sagen?
          So "lose" ist die Aussage nicht viel wert.

          Geschwindigkeit (glob ist lahm)
          Rekursiv (da von Haus aus nicht möglich - "tiefer geschachtelte Strukturen")

          Den interessanten Kram findet man in PHPs Doku grundsätzlich in den User Contributed Notes... ;)

          weiterhin schönen abend...

          --
          #selfhtml hat ein Forum?
          sh:( fo:# ch:# rl:| br:> n4:& ie:{ mo:} va:) de:] zu:} fl:( ss:? ls:[ js:|
          1. Hello,

            Kannst Du dazu noch ein bisschen mehr sagen?
            So "lose" ist die Aussage nicht viel wert.

            Geschwindigkeit (glob ist lahm)

            Das ist aber nur eine halbe Aussage. Es sind die Testbedingungen nicht genannt und ich könnte mir vorstellen, dass der "Tester" hier vergessen hat zu erwähnen, dass Glob schon den größten Teil der Arbeit erledigt (Filterung der Dateien, Verzeichnisse, Links usw auch nach Namen), während dieser bei readdir() erst noch bevorsteht. dann dürfte sich dieser Vorteil sehr schnell reduzieren oder sogar umkehren.

            Rekursiv (da von Haus aus nicht möglich - "tiefer geschachtelte Strukturen")

            Um Verzeichnisbäume zu sammeln (oalso erstmal ohne Dateien) hatte ich neulich eine weitere Lösung vorgestellt, die durchaus praktisch ist und vor allem zyklische Verläufe durch Symbolic Links ausgeschlossen hat, _ohne_ die Symbolic Links selber auszuschließen.

            Das steht hier irgendwo im Archiv. Dedlfix hat's anschließend kontrolliert, sodass ich hoffe, dass wir keinen Fehler darin hinterlassen haben.

            Hab's gefunden: http://forum.de.selfhtml.org/archiv/2007/12/t163759/#m1066530

            Harzliche Grüße aus
            Sankt Andreasberg
            und Frohes Neues Jahr

            Tom

            --
            Nur selber lernen macht schlau

  2. n'abend,

    Das Script funktioniert auch soweit, nur werden die Bilder nicht "alphabetisch" oder "der Reihe nach" ausgelesen, sondern wild durcheinander.

    Du möchtest eine Sortierung nach dem Dateinamen, Klaus eine Sortierung nach der Dateigröße und Ulf eine Sortierung nach dem Änderungsdatum. Da zur Auslesezeit nicht bekannt ist, wie die Elemente sortiert werden sollen, musst du das selbst erledigen.

    Mittels sort() oder einer der vielen anderen Sortierungsfunktionen kannst du das ganz einfach selbst erledigen. Dazu musst du zuerst das Verzeichnis auslesen, die gefundenen Dateien in einem Array zwischenspeichern, das Array sortieren, das sortierte Array durchlaufen, um deine Ausgabe zu erzeugen:

     $ordner = 'meine/bilder';  
      
    // Verzeichnis öffnen  
    $dh = opendir( $ordner );  
    if( !$dh )  
      trigger_error( 'Konnte '. $ordner .' nicht öffnen' );  
      
    // Verzeichnis auslesen  
    $images = array();  
    while( ($file = readdir($dh)) !== false )  
    {  
      // Dateien, die keine JPG, GIF oder PNG Bilder sind überspringen  
      if( !eregi("\.(jpg|gif|png)$",$dateiname) || !is_file( $ordner .'/'. $file ) )  
        continue;  
      
      $images[] = $file;  
    }  
    closedir( $dh );  
      
    // Dateien sortieren  
    sort( $images );  
      
    // Dateien ausgeben  
    foreach( $images as $image )  
    {  
      echo $ordner, '/', $image;  
    }  
    
    

    weiterhin schönen abend...

    --
    #selfhtml hat ein Forum?
    sh:( fo:# ch:# rl:| br:> n4:& ie:{ mo:} va:) de:] zu:} fl:( ss:? ls:[ js:|
    1. Hi,

      1000x Dank für die Vorlage.
      Ich bin PHP-Anfänger und es war schwer genug "mein" Script zu schreiben.
      Aber jetzt gehts prima.
      :-)

      LG

      Jochen