Wie Verzeichnisse rekursiv UND sortiert auslesen?
Klaus
- php
Hallo miteinander,
von einem Script bekomme ich einen webserver-Pfad $pfad als string übergeben.
mit einem PHP Script lese ich aus $pfad Verzeichnisse und Dateien rekursiv aus. Das klappt ganz gut.
Nur: jetzt ist die nächste Anforderung meines Kunden, daß alles so wie in Windows aussehen soll. Sprich die Verzeichnisse sollen oben stehen, alphabetisch sortiert, dann erst kommen, ebenfalls alphabetisch sortiert, die Dateien. Für Unterverzeichnisse gilt dieselbe Sortierung.
Und hier, zugegebenermaßen, stehe ich auf dem Schlauch. Habe mein Glück schon mit uasort probiert, bin aber zu keinem zufriedenstellenden Ergebnis gekommen.
Kennt jemand von Euch vielleicht ein PHP Script/Beispiel, was genau das macht? Eventuell bin ich nicht der erste auf der Welt, der Verzeichnisse rekursiv auslesen und dann sortiert darstellen soll.
Bin für jeden Tipp dankbar.
Viele Grüße
Klaus
hi,
Nur: jetzt ist die nächste Anforderung meines Kunden, daß alles so wie in Windows aussehen soll. Sprich die Verzeichnisse sollen oben stehen, alphabetisch sortiert, dann erst kommen, ebenfalls alphabetisch sortiert, die Dateien. Für Unterverzeichnisse gilt dieselbe Sortierung.
Lese aus, sortiere dann, und gebe erst anschließend aus.
gruß,
wahsaga
check this out.
function get_dir ($dir) {
$fp=opendir($dir);
while($datei=readdir($fp)) {
if (is_dir("$dir/$datei") && $datei!="." && $datei!="..") {echo "$datei (dir)<br>";}
else {echo $datei."<br>";}
}
closedir($fp);
}
ich denke das kann dir schon mal helfen.
sushi
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.
Hi,
Bin für jeden Tipp dankbar.
Vor den Ordnernamen ein "Schlüsselzeichen", vor den Dateinamen ein "anderes Schlüsselzeichen", sortieren, Schlüsselzeichen entfernen -> sortiert und Ordner stehen oben (oder unten)
Gruß, Cybaer
Hallo Cybaer.
Bin für jeden Tipp dankbar.
Vor den Ordnernamen ein "Schlüsselzeichen", vor den Dateinamen ein "anderes Schlüsselzeichen", sortieren, Schlüsselzeichen entfernen -> sortiert und Ordner stehen oben (oder unten)
Mittels is_file() und is_dir() ausgelesene Verzeichnisinhalte getrennt in zwei Arrays ablegen, diese sortieren und wieder zusammen ausgeben.
Einen schönen Donnerstag noch.
Gruß, Ashura
Hi,
Mittels is_file() und is_dir() ausgelesene Verzeichnisinhalte getrennt in zwei Arrays ablegen, diese sortieren und wieder zusammen ausgeben.
Auch nicht schlecht.
Allerdings lasse *ich* den Schlüsselwert i.d.R. vor dem Eintrag. Es ist bei der Ausgabe auch noch die sichtbare Kennung/das Icon für einen Ordner bzw. eine Datei. :)
Gruß, Cybaer