Tobias Pelster: Verzeichnisbaum natürlich sortiert als HTML-Liste

Beitrag lesen

Hallo zusammen!
Ich stehe vor dem Problem, eine Ordnerstruktur erstellen zu lassen, die ich dann als ungeordnete HTML-Liste ausgeben lasse.
Das Erstellen und Ausgeben an sich ist kein Problem, (mit while(readdir()) -> if (isdir) RekursiverAufruf, else echo <li>file</li> ), jedoch hängt die Sortierung so von readdir() ab. Ich würde sie aber gerne natürlich sortieren lassen. Im laufenden readdir geht das ja natürlich nicht, und am Ende der Funktion isses auch schlecht, denn der Rückgabewert ist bereits der komplette HTML- Listenabschnitt.
Wie muß ich also die Funktion umschreiben, daß ich am Ende die Liste geordnet zurück bekomme?

Hier mal meine Funktion. (Über anderweitige Verbesserungsvorschläge wäre ich ebenso dankbar. So ganz überzeugt von ihr bin ich selber noch nicht :-D)

  
/**  
* parse_dir()  
* Erstellt die aktuelle Ordnerstrucktur und gibt sie als  
* unsortierte Liste wieder aus  
* @param fullPath Pfad  
* @return HTML-Code mit Ordneranzeige  
*/  
function parse_dir($fullPath) {  
  if ( $fullPath == CONFIG_DOCS_PATH ) // CONFIG_DOCS_PATH = Rootverzeichnis  
    echo '<a href="http://'.$_SERVER[ 'SERVER_NAME' ].$_SERVER[ 'PHP_SELF' ].'?action=list">Home</a>';  
  $smallPath = str_replace( CONFIG_DOCS_PATH, '', $fullPath); // Anfang des Strings entfernen  
  $out = '<ul>';  
  if ( $dh = @opendir( $fullPath ) ) {  
    while( ( $file = readdir( $dh ) ) !== FALSE ) {  
      if( !preg_match( '/^\./s', $file ) )  {  
        if( is_dir( $fullPath.'/'.$file ) ) {  
          $out .= '<li><a href="http://'.$_SERVER[ 'SERVER_NAME' ].$_SERVER[ 'PHP_SELF' ].'?action=list&path='.$smallPath.'/'.$file.'">'.$file."</a>\n";  
          $newPath = $fullPath.'/'.$file; // <- tailing slash  
          chdir( $newPath );  
          $out .= parse_dir( $newPath ); // rekursiver Aufruf  
          $out .= '</li>';  
        } else {  
          // nüscht  
        }  
      }  
    }  
    chdir('..');  
  }  
  if ( $out == '<ul>' ) { // Falls kein Unterordner in diesem Ordner  
    return ;  
  } else  
    return $out.'</ul>';  
}  

Und dies ist die Ausgabe

  
<a href="http://.../index.php?action=list">Home</a>  
<ul>  
  <li><a href="http://.../index.php?action=list&amp;path=/Testordner">Testordner</a></li>  
  <li><a href="http://.../index.php?action=list&amp;path=/Ordnerggg">Ordnerggg</a>  
    <ul>  
      <li><a href="http://.../index.php?action=list&amp;path=/Ordnerggg/lala">lala</a></li>  
    </ul>  
  </li>  
</ul>  

Hoppe jemand kann helfen :D