Mehrdimensionale Arrays aus Verzeichnisstruktur

Einklappen
X
 
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • Mehrdimensionale Arrays aus Verzeichnisstruktur

    Hallo,

    ich verwende die unten aufgeführte Klasse (gefunden bei Benutzerkommentaren in der Online-PHP-Doku), die ich an unsere Bedürfnisse angepasst habe. Leider bekomme ich es nicht hin, (zusätzlich) mehrdimensionale Arrays generieren zu lassen, die die Verzeichnisstruktur "darstellen".

    Biespielhafte Verzeichnisstruktur:

    Code:
    STARTDIR
     |
     |-- AAA
     |-- BBB
     |-- CCC
     |    |
     |    |-- C1
     |    |-- C2
     |-- DDD
     |    |
     |    |-- D1
     |    |-- D2
     |    |    |
     |    |    |-- D2A
     |    |    |-- D2B
     |    |    |-- D2C
     |    |    |     |
     |    |    |     |-D2C1
     |    |    |     |-D2C2
    Das Array soll dann ungefähr so aussehen:

    Code:
    Array
    (
        [AAA] => DIR
        [BBB] => DIR
        [CCC] => Array
            (
                [C1] => DIR
                [C2] => DIR
            )
        [DDD] => Array
            (
                [D1] => DIR
                [D2] => Array
                   (
                       [D2A] => DIR
                       [D2B] => DIR
                       [D2C] => Array
                           (
                               [D2C1] => DIR
                               [D2C2] => DIR
                           )
                   )
            )
    )
    Ich finde nun keine Logik, mit der ich dieses Array bauen lassen soll, obwohl das Prinzip im Kopf ganz banal erscheint. Das Problem liegt darin, dass man vorher nicht weiß, wie viele Ebenen und Unterebenen usw. das Array haben soll.

    Sage ich z. B. $blah[$x]=$aktuelles_verz, müsste ich, sofern dieses Unterverzeichnisse hat, beim nächsten Durchlauf $blah[$x]$[y]=$aktuelles_verz sagen können. Und wenn dieses wieder Unterverzeichnisse hat, $blah[$x][$y][$z]=$aktuelles_verz. Aber wie bringe ich ihm bei, dass er dann immer eine Ebene weiterschaltet? Und v. a. wie schreibe ich das in PHP? Die eckigen Klammern können sich ja nicht alleine basteln.

    Ideal wäre, wenn zusätzlich zu jedem Verzeichnis die Anzahl der sich darin befindlichen Dateien im Array abgelegt werden würde. Aber hier hatte ich bisher noch nicht einmal eine sinnvolle Idee, wie das Array strukturiert sein müsste.

    Hier mal die Klasse (erweitert, da ich nicht mehr weiß, wo die ursprüngliche genau war):

    PHP-Code:
    class clVerzDateien {
       var 
    $datarray;
       var 
    $datoptions;
       var 
    $verzarray;
       function 
    doThisVerz($dir) {
           
    $olddir=$dir;
           
    $dirList[]=$dir;
           while((
    $currDir=array_pop($dirList))!==NULL) {
            
    $dir=opendir($currDir);
            while((
    false!==($file=readdir($dir)))) {
             if (
    $file=="." || $file=="..") {
                continue;
             }

             
    $fullName=$currDir.'/'.$file;

             if (
    is_dir($fullName)) {
                
    array_push($dirList,$fullName);
                continue;
             }
             ++
    $cnt;
             
    $this->datarray[str_replace($olddir.'/',"",$currDir)][$cnt]=$file;
            }
            
    closedir($dir);
           }
           
    natcasesort($this->datarray);
           
    ksort($this->datarray);
           return 
    $this->datarray;
       }

       function 
    doOptions($mark=FALSE,$asfile=FALSE) {
        unset(
    $this->datoptions);
        
    $asfile=($asfile) ? 'file;#;' '';
        foreach(
    $this->datarray as $verz=>$werte) {
         
    $this->datoptions.='<optgroup label="'.$verz.'">';
         foreach(
    $werte as $datei) {
          
    $selected=($asfile.$verz.'/'.$datei==$mark) ? 'selected' '';
          
    $this->datoptions.='<option value="'.$asfile.$verz.'/'.$datei.'" '.$selected.'>'.$datei.'</option>';
         }
         
    $this->datoptions.='</optgroup>';
        }
        return 
    $this->datoptions;
       }

    Ich weiß nicht, ob das eine Kleinigkeit oder doch eine Herausforderung für euch ist. Für mich ist das ein großer Fels

    Danke fürs Lesen,

    pb

  • #2
    Hier habe ich doch noch die originale Klasse gefunden, falls Sie jemandem behilflich ist.

    PHP-Code:
    class DirWalker {
       function 
    go ($dir) {
           
    $dirList[] = $dir;
           while ( (
    $currDir array_pop($dirList)) !== NULL ) {
               
    $dir opendir($currDir);
               while((
    false!==($file=readdir($dir)))) {
                   if(
    $file =="." || $file == "..") {
                       continue;
                   }
                  
                   
    $fullName $currDir DIRECTORY_SEPARATOR $file;
                  
                   if ( 
    is_dir $fullName ) ) {
                       
    array_push $dirList$fullName );
                       continue;
                   }
                  
                   
    $this->processFile ($file$currDir);
               }
               
    closedir($dir);
           }
       }
      
       function 
    processFile $file$dir ) {
           print (
    "DirWalker::processFile => $file$dir\n");
       }

    http://de.php.net/manual/de/function.readdir.php vom 16.05.05

    Kommentar

    Lädt...
    X