Verzeichnis auslesen und in Array schreiben
Buubel
- php
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
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
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
Hallo,
while ($bild = readdir($dir))
bitte eigne Dir dringend folgene Vorgehensweise an:
while(($bild=readdir($dir)!==false)
Gruß aus Berlin!
eddi
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
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
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 ((-:
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
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
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
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
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
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
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
Hallo Tom!
while ( ($bild = readdir($dir)) !== false )
Danke, jetzt hab ich's kapiert!
Mfg Buubel
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
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.deTom
Harzliche Grüße vom Berg
http://www.annerschbarrich.de
Tom
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
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
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
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
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
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