Lieber wahsaga,
Lese aus, sortiere dann, und gebe erst anschließend aus.
ich stimme Dir (mal abgesehen von Deinem Imperativ) vollkommen zu.
Hier möchte ich dem OP noch mein Script anbieten (denn er schreibt, dass es "wie im Explorer aussehen" soll):
<?php
// =================
// Download-Ordner
// =================
// Funktion für die Dateibaum-Liste
function explorer_vorbereiten($verzeichnisse, $pfad)
{
$tabs = preg_replace("/[^\/]*(\/)[^\/]*/", "\t", $pfad);
$liste = $tabs."<ul>\r\n";
foreach($verzeichnisse as $stamm => $zweig)
{
$flag = "datei";
if($stamm != "0")
{
if(is_array($zweig))
{
uksort($zweig, "ordner_zuerst");
$flag = "ordner";
$pfad .= $stamm."/";
$liste .= $tabs."\t<li".' class="auf" onclick="aufzu(this)"><span><img src="/html/images/icons/folderopen.gif" alt="icon" />'.$stamm."</span>\r\n";
$liste .= explorer_vorbereiten($zweig, $pfad, $liste);
$pfad = substr($pfad, 0, strlen($pfad) - strlen($stamm)-1);
$liste .= $tabs."\t</li>\r\n";
}
else
{
$typ = substr($stamm, strrpos($stamm, ".")+1);
if(strrpos($stamm, ".") < 1)
{
$liste .= "$tabs\t<li".' class="auf" onclick="aufzu(this)"><span><img src="/html/images/icons/folderopen.gif" alt="icon" />'."$stamm</span>\r\n$tabs\t\t<ul>\r\n$tabs\t\t</ul>\r\n$tabs\t</li>";
}
else
{
$filetype = substr($stamm, strrpos($stamm, ".")+1);
$liste .= $tabs."\t<li".' class="file"><a href="/html'.$pfad.rawurlencode($stamm).'" onclick="auswahl()">'.hole_icon($filetype)."$stamm</a></li>\r\n";
}
}
}
}
$liste .= $tabs."</ul>\r\n";
return $liste;
}
// Funktion zum Zuordnen eines passenden Fileicons zum Dateityp
function hole_icon($kuerzel)
{
$icon_datei = "";
$icons = array(
"dir" => 'folder.gif',
"doc" => 'doc.gif',
"rtf" => 'doc.gif',
"dat" => 'dat.gif',
"css" => 'dat.gif',
"default" => 'default.gif',
"gif" => 'img.gif',
"jpg" => 'img.gif',
"jpeg" => 'img.gif',
"png" => 'img.gif',
"htm" => 'htm.gif',
"html" => 'htm.gif',
"inc" => 'inc.gif',
"js" => 'js.gif',
"vbs" => 'js.gif',
"htc" => 'js.gif',
"mov" => 'mov.gif',
"mp3" => 'mp3.gif',
"pdf" => 'pdf.gif',
"php" => 'php.gif',
"ppt" => 'ppt.gif',
"pps" => 'ppt.gif',
"rar" => 'rar.gif',
"txt" => 'txt.gif',
"asf" => 'wmp.gif',
"asx" => 'wmp.gif',
"wma" => 'wmp.gif',
"wmv" => 'wmp.gif',
"avi" => 'wmp.gif',
"mpg" => 'wmp.gif',
"mpeg" => 'wmp.gif',
"xls" => 'xls.gif',
"xml" => 'xml.gif',
"zip" => 'zip.gif',
);
if(array_key_exists($kuerzel, $icons))
{
$icon_datei = $icons[$kuerzel];
}
else
{
$icon_datei = $icons["default"];
}
return '<img src="/html/images/icons/'.$icon_datei.'" alt="icon" />';
}
// Callback-Funktion für das Sortieren des Verzeichnisse-Arrays damit die Ordner immer zuerst stehen
function ordner_zuerst($key1, $key2)
{
$flag = 0;
if(strrpos($key1, ".")) $flag = $flag + 1;
if(strrpos($key2, ".")) $flag = $flag + 2;
if($flag > 0 && $flag < 3) return ($flag > 1) ? -1 : 1;
return strnatcmp($key1, $key2);
}
// Funktion für Verzeichnisbaum
function make_tree($path, $mode)
{
$list = array();
$handle=opendir($path);
while($a=readdir($handle))
{
if(!preg_match('/^\./',$a))
{
$full_path="$path/$a";
switch($mode)
{
case "all": $list[]=$full_path; break;
case "dir": if(is_dir($full_path)) $list[]=$full_path; break;
case "file": if(is_file($full_path)) $list[]=$full_path; break;
}
if(is_dir($full_path))
{
$recursive=make_tree($full_path, $mode);
for($n=0; $n<count($recursive); $n++)
{
$list[]=$recursive[$n];
}
}
}
}
closedir($handle);
return $list;
}
// ==================
// Jetzt geht's los!
// ==================
$pfad = "./download";
// HTML-Grundgerüst aufbauen
$html_inhalt = "template.html";
// Dateibaum generieren
// Verzeichnisliste erstellen
$alle_dateien = make_tree("download", "all");
$verzeichnis_array = array();
for($i=0;$i<count($alle_dateien);$i++)
{
$alle_dateien[$i] = explode("/", $alle_dateien[$i]);
$temp_array = array();
while(count($alle_dateien[$i]) > 0)
{
$test = array_pop($alle_dateien[$i]);
if(count($temp_array) > 0)
{
$temp_array = array($test => $temp_array);
}
else
{
$temp_array = array($test => "");
}
}
$verzeichnis_array = array_pad($verzeichnis_array, count($verzeichnis_array)+1, $temp_array);
}
$verzeichnisse = array();
foreach($verzeichnis_array as $temp)
{
$verzeichnisse = array_merge_recursive($verzeichnisse, $temp);
}
// Verzeichnisliste zu einer HTML-Liste wandeln
$explorer_baum = explorer_vorbereiten($verzeichnisse, "/"); // Verzeichnisstruktur als <ul> fertig formatiert mit Fileicons herstellen
$explorer_baum = preg_replace("/(?is)^[^<]*<ul>/", '<ul class="explorer-baum">', $explorer_baum); // den Explorerbaum mit einer ID versehen
$explorer_baum = preg_replace("/<ul>[ \r\n\t]*<\/ul>/", "", $explorer_baum); // leere <ul>s entfernen
// Kosmetik: Klassendefinitionen oder/und spezielle Icons im Baum eintragen
$explorer_baum = preg_replace("/(<img[^>]+)folderopen.gif([^>]+>download)/", "\\1hddopen.gif\\2", $explorer_baum); // Icon für den Download-Ordner
$explorer_baum = preg_replace("/(<img[^>]+)folderopen.gif([^>]+>mp3s)/", "\\1musicfolderopen.gif\\2", $explorer_baum); // Icon für den mp3-Ordner
$explorer_baum = preg_replace('/(<img[^>]+)folderopen.gif([^>]+>multimedia)/', "\\1cdopen.gif\\2", $explorer_baum); // Icon für den mp3-Ordner
// Platzhalter im Inhalt füllen
$html_inhalt = str_replace("{Explorer}", $explorer_baum."</div>\n", $html_inhalt);
// Seite fertigstellen und ausgeben
echo $html_inhalt;
?>
Zu bewundern ist dieses Script im Einsatz auf http://www.peutinger-gymnasium.de/html/kontakt/download/index.html. Dort ist auch das zugehörige CSS und Javascript für das Auf- und Zusammenfalten der Ordner zu sehen.
Liebe Grüße aus Ellwangen,
Felix Riesterer.