Klaus: Wie Verzeichnisse rekursiv UND sortiert auslesen?

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

  1. 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

    --
    /voodoo.css:
    #GeorgeWBush { position:absolute; bottom:-6ft; }
    1. 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

    2. 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.

  2. 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

    --
    Hinweis an Fragesteller: Fremde haben ihre Freizeit geopfert, um Dir zu helfen. Helfe Du auch im Archiv Suchenden: Beende deinen Thread mit einem "Hat geholfen" oder "Hat nicht geholfen"!
    1. 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

      1. 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

        --
        Hinweis an Fragesteller: Fremde haben ihre Freizeit geopfert, um Dir zu helfen. Helfe Du auch im Archiv Suchenden: Beende deinen Thread mit einem "Hat geholfen" oder "Hat nicht geholfen"!