Felix Riesterer: Wie Verzeichnisse rekursiv UND sortiert auslesen?

Beitrag lesen

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.