Ankündigung

Einklappen
Keine Ankündigung bisher.

Verzeichnisstrukur in Array

Einklappen

Neue Werbung 2019

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

  • Verzeichnisstrukur in Array

    Hallo!

    ich habe ein problem. und zwar möchte ich gerne einen ordner der mehrere ordner, Datein, Weitere Unerordner etc. enthält komplett in einen Mehrdimensionalen Array schreiben.

    leider gelingt es mir nicht die unterverzeichnisse einzuordnen.

    Ordner Strucktur:
    Code:
    test1
       sub1
       sub2
       sub3
    Test2
    Test3
       sub1
       sub2
    PHP-Code:
             $path           "Database/";
             
    $dir            openDir($path);
             
    $data           = array();
             
    $i              0;
             while(
    $primary readDir($dir))
             {
                     
    $primarypath $path.$primary;
                     if(!
    strstr($primary"."))
                     {
                             
    $data[$i]       = $primary;
                             
    $newpath        $path.$primary."/";
                             
    $subdir         opendir($newpath);
                             
    $f              10;
                             while(
    $secondary readDir($subdir))
                             {
                                     
    $secondarypath $newpath.$secondary;
                                     if(
    is_dir($secondarypath) AND !strstr($secondary"."))
                                     {
                                             
    $data[$i][$f] = $secondary;
                                             
    $f++;
                                     }
                             }
                             
    $i++;
                     }
             }
             
    closeDir($dir); 
    Ergebniss:
    Code:
    Array
    (
        [0] => test1     sss
        [1] => Test2
        [2] => Test3     ss
    )
    Ich habe as gefühl das das script ansich funktioniert, da er an den richtigen stellen sein "s" setzt... leider öffnet er keinen neuen unter array und füll dort den ganzen namen "sub1" anstatt "s" ein. aber wo ist mein fehler?
    wie kann ich den array anständig befüllen.

  • #2
    PHP-Code:
    $data[$i]  = $primary
    Damit wird $data[$i] zum String. Sollte das nicht eher so ähnlich heißen:

    PHP-Code:
      $data[$i] = array (
         
    'name' => $primary
         
    'subdirs' => array()
      ); 
    Zweite Zuweisung dann logischerweise

    PHP-Code:

    $data
    [$i]['subdirs'][$f] = ... 

    Kommentar


    • #3
      Ich würde das ganze eher iterativ aufziehen. also be jedem Verzeichnis einen neuen Funktionsaufruf, der einen Array der Dateien zurückgibt, der dann in der aufrufenden Instanz analog zu den Dateinamen hinzugefügt wird.

      Kommentar


      • #4
        Danke!

        das mit dem array funktioniert jetzt super.

        aber ich hab ein weiteres problem.
        und zwar eine Fehlermeldung:
        Notice: Undefined offset: 4 in C:\Programme\wamp\www\index.php on line 89
        (an mehreren stellen)

        er sagt das "while($data[$i])" keinen 5ten eintrag also "[4]" hat. das stimmt auch. aber ich frage auch garkein 5tes mal ab.
        die schleife sieht so aus:
        PHP-Code:
                 while($data[$i])
                 {
                         
        // Hauptverzeichniss ausgeben:
                         
        $l1path $path."".$data[$i]['name'];
                         if(
        strstr($data[$i]['name'], $sym))
                         {
                                 
        $name   explode($sym$data[$i]['name']);
                                 
        $name   $name[1];
                         }
                         else{   
        $name   $data[$i]['name'];   }
                         echo 
        "<span style='margin-left:10px;'><a href='$l1path'>$name</a></span><br/>";

                         
        // Unterverzeichnis Level 2 ausgeben:
                         
        $i2     =       0;
                         
        sort($data[$i]['l2']);
                         while(
        $data[$i]['l2'][$i2])
                         {
                                 
        $l2path $l1path."/".$data[$i]['l2'][$i2]['name']."/";
                                 if(
        strstr($data[$i]['l2'][$i2]['name'], $sym))
                                 {
                                         
        $name   explode($sym$data[$i]['l2'][$i2]['name']);
                                         
        $name   $name[1];
                                 }
                                 else{   
        $name   $data[$i]['l2'][$i2]['name'];   }
                                 echo 
        "<span style='margin-left:40px;'><a href='$l2path'>$name</a></span><br/>";
                                 
        $i2++;
                         }

                         
        // Datein des Unterverzeichnis Level 2 ausgeben:
                         
        $i2     =       0;
                         
        sort($data[$i]['f']);
                         while(
        $data[$i]['f'][$i2])
                         {
                                 
        $l2path $l1path."/".$data[$i]['f'][$i2];
                                 if(
        strstr($data[$i]['f'][$i2]['name'], $sym))
                                 {
                                         
        $name   explode($sym$data[$i]['f'][$i2]);
                                         
        $name   $name[1];
                                 }
                                 else{   
        $name   $data[$i]['f'][$i2];   }
                                 echo 
        "<span style='margin-left:40px;'><a href='$l2path'>[FILE] $name</a></span><br/>";
                                 
        $i2++;
                         }
                         
        $i++;
                 } 

        vereinfacht ist das also:
        PHP-Code:
                 while($data[$i])
                 {
                                          [...]
                                          
        $i++;
                 } 
        das hat bisher immer auf "server2go" funktioniert. ohne fehlermeldung. jetzt steht die seite auf "wamp". gibts eine neuerung in den php vorgaben dafür?

        mfg Chris

        Kommentar


        • #5
          gibts eine neuerung in den php vorgaben dafür?
          Nö, die Bedingungen sind einfach schrott.
          Code:
          while($data[$i])
          Theoretisch fragst du hier Elemente bis zum Sanktnimmerleinstag ab, auch wenn diese gar nicht existieren. Im Grunde kannst du froh sein, dass du eine Fehlermeldung bekommst.
          So prüft man jedenfalls nicht, ob Variablen oder Indizes existieren. Du solltest dich mal durchs Board wühlen oder Google bemühen.
          [URL]http://hallophp.de[/URL]

          Kommentar


          • #6
            Moin,

            warum ziehst du das ganze denn nicht rekursiv auf? Da brauchst nur eine Funktion die sich jedes mal selbst wieder aufruft wenn du z.B. weitere Unterverzeichnisse findest. Da sparst du eine Menge Code und das ganze bleibt übersichtlicher.

            Schau mal hier ins Wiki, ich glaube da existiert so ein Artikel wie rekursiv Verzeichnisse ausliest.

            Gruß Litter
            Aus dem Dynamo Lande kommen wir. Trinken immer reichlich kühles Bier. Und dann sind wir alle voll, die Stimmung ist so toll. Aus dem Dynamo Lande kommen wir.
            [URL]http://www.lit-web.de[/URL]

            Kommentar


            • #7
              Das du vorher keine Fehlermeldung bekommen hast lag entweder an einer anderen Einstellung des Fehlerreportings oder einer anderen PHP Version.

              Deine Schleifenbedingung prüft ob in data[$i] irgendetwas drin ist, das man irgendwie als true interpretieren könnte. Besser wäre ein isset() oder array_key_exists().

              Kommentar


              • #8
                Zitat von mquadrat Beitrag anzeigen
                Deine Schleifenbedingung prüft ob in data[$i] irgendetwas drin ist, das man irgendwie als true interpretieren könnte. Besser wäre ein isset() oder array_key_exists().
                oder noch besser, eine for() Schleife.

                Kommentar


                • #9
                  @Dormilich

                  Ähm stimmt. Die hatte ich ganz vergessen. *schäm*

                  Kommentar


                  • #10
                    Hey danke!

                    super hilfen, wie immer

                    ich hab euren vorschlag befolgt und eine Rekursive Funktion Ggeschrieben. die funktioniert super und macht einen schönen array für alle ordnertiefen.
                    ich denke vlt kann das ja in zukunft irgendjemand gebrauchen:

                    PHP-Code:
                             function read_dir($path,$folder)
                             {
                                     
                    $dir    openDir($path.$folder);

                                     
                    $all    = array(
                                                     
                    'name' => $folder,
                                                     
                    'subd' => array(),
                                                     
                    'file' => array()
                                                     );
                                     while(
                    $objekt readDir($dir))
                                     {
                                             
                    $currentpath $path."/".$folder."/".$objekt;
                                             if(
                    is_dir($currentpath) AND !strstr($objekt"."))
                                             {
                                                     
                    $subpath        $path."/".$folder."/";
                                                     
                    $all['subd'][]  = read_dir($subpath,$objekt);
                                             }
                                             if(
                    is_file($currentpath))
                                             {
                                                     
                    $all['file'][]  = $objekt;
                                             }
                                     }
                                     
                    closeDir($dir);
                                     return 
                    $all;
                             } 

                    Kommentar

                    Lädt...
                    X