Script liest Verzeichnis falsch aus
Jochen
- php
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
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
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...
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
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...
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
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...
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