Hallo Tobias Pelster,
*snif* Keiner eine weitere Idee?
Was mir an deinem Ergebnis-Array nicht gefällt, ist seine "Kompliziertheit". Da die Keys in PHP-Arrays ja bekanntlich Strings enthalten, eignen sie sich prima, um Datei- oder Verzeichnisnamen zu speichern. Ich denke mir das jetzt mal so:
Die Values enthalten entweder nichts (oder einen Dummy-Eintrag), wenn sie ein "Nicht-Verzeichnis" darstellen sollen -- also meistens Dateien.
Die Values enthalten ein (Unter-)Array, wenn sie ein Verzeichnis darstellen sollen.
Das ist einfacher als dein Entwurf (IMHO). Außerdem sortiere ich die Einträge gleich, wenn sie eingelesen wurden und nicht erst bei der Ausgabe.
Sollte dir die Sortierreihenfolge nicht gefallen, kannst du ja statt ksort() uksort benutzen und dir die passende Vergleichsfunktion selbst basteln.
Vielleicht einen Link zu einer fertigen Funktion? Die, die ich selbst gefunden habe, waren entweder nicht rekursiv oder interessieren sich nicht um die Sortierung, sondern hauen die Einträge direkt raus.
Kein Link, sondern was aus meiner PHP-Code-Restekiste:
function scanr_dir(
$dir_name
) {
// Notfalls den letzen Verzeichnistrenner entfernen
// (außer wir haben '/' übergeben bekommen)
$dir_name = preg_replace('/[^\A]'.preg_quote(DIRECTORY_SEPARATOR, '/').'\Z/', '', $dir_name);
$dh = @opendir($dir_name);
if(FALSE === $dh) exit( sprintf('Verzeichnis "%s" gibts gar nicht!', $dir_name) );
// einlesen
$dir_list = array(); // Falls das Verzeichnis mal leer ist
while($dir_entry = @readdir($dh) ) {
if('.' == $dir_entry || '..' == $dir_entry) continue;
if( is_dir($dir_name.DIRECTORY_SEPARATOR.$dir_entry) ) $dir_list[$dir_entry] = array();
else $dir_list[$dir_entry] = 'file';
// statt 'file' kannst du hier auch Informationen zur Datei zwischenlagern
}
//Nach den Namen sortieren
ksort($dir_list);
foreach($dir_list as $key => $val) {
printf('k(%s) v(%s)<br />', $key, $val);
// Rekursion:
if( is_array($val) )
$dir_list[$key] = scanr_dir( $dir_name.DIRECTORY_SEPARATOR.$key );
}
return($dir_list);
}
Die Ausgabe, oder noch besser: "Das Rendering in HTML" B-), erfolgt in
einer separaten Funktion.
Und weil wir hier bei SELFHTML sind, hab ich dir noch eine Aufgabe übriggelassen: Es werden nämlich im Moment nur die Teilpfade angezeigt.
Willst du für jeden Eintrag den ganzen Pfad anzeigen, musst du noch ein wenig basteln -- z.B. Der Funktion noch einen zusätzlichen Parameter
$aktueller_basispfad mitgeben ...)
function html_make_dir_list(
$dir_list
) {
$html = '<ul>';
foreach($dir_list as $key => $val) {
if( is_array($val) ) $html .= sprintf('<li>[%s] %s</li>', $key, html_make_dir_list($val) );
else $html .= sprintf('<li>%s</li>', $key);
}
$html .= '</ul>';
return($html);
}
Das ganze in Aktion (zur Probe):
$dirs = scanr_dir('irgendein_pfad');
// Die Liste als "rekursives" Array
printf('<pre>%s</pre>', print_r($dirs, 1) );
// Der HTML-Output:
printf('<hr />%s', html_make_dir_list($dirs) );
MffG
EisFuX
Auch meine Hosenträger sind intelligent, in dem Sinne, dass man sie regulieren kann. Sie besitzen ein adaptives Verhalten.
Stanisław Lem
