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

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

  1. Hallo Tobias.

    Wie muß ich also die Funktion umschreiben, daß ich am Ende die Liste geordnet zurück bekomme?

    Du könntest die üblichen Sortierfunktionen für Arrays verwenden, wenn du scandir oder glob benutzt.

    Hoppe jemand kann helfen :D

    Hoppe, hoppe Reiter …

    Einen schönen Mittwoch noch.

    Gruß, Ash*hört sich jetzt „Mutter“ an*ura

    --
    sh:( fo:} ch:? rl:( br: n4:~ ie:{ mo:| va:) de:> zu:} fl:( ss:) ls:[ js:|
    „It is required that HTML be a common language between all platforms. This implies no device-specific markup, or anything which requires control over fonts or colors, for example. This is in keeping with the SGML ideal.“
    [HTML Design Constraints: Logical Markup]
    1. Wie muß ich also die Funktion umschreiben, daß ich am Ende die Liste geordnet zurück bekomme?

      Du könntest die üblichen Sortierfunktionen für Arrays verwenden, wenn du scandir oder glob benutzt.

      Hui, das ging schnell mit der Antwort.
      Das Problem ist: Ich hab ja (leider) kein Array. Das hab ich auch schon überlegt; den Baum als Array abzubilden. Nur: wie stell ich das dann als unsortierte Liste dar? var_dump(Array) ist leider nicht so schön :-D

      1. Hallo Tobias.

        Das Problem ist: Ich hab ja (leider) kein Array.

        Wenn du scandir bzw. glob verwendest schon.

        Das hab ich auch schon überlegt; den Baum als Array abzubilden. Nur: wie stell ich das dann als unsortierte Liste dar?

        Einfach das Array mit den Verzeichniseinträgen mit einer Schleife durchlaufen?

        Einen schönen Mittwoch noch.

        Gruß, Ashura

        --
        sh:( fo:} ch:? rl:( br: n4:~ ie:{ mo:| va:) de:> zu:} fl:( ss:) ls:[ js:|
        „It is required that HTML be a common language between all platforms. This implies no device-specific markup, or anything which requires control over fonts or colors, for example. This is in keeping with the SGML ideal.“
        [HTML Design Constraints: Logical Markup]