Rekursiv Verzeichnise in ein Array laden

Neurodeamon

Erfahrenes Mitglied
Ich möchte jetzt keine Codebeispiele oder sonst übliches ;)
Im Moment arbeite ich zum x-ten mal ein einem Script, das Verzeichnisse rekursiv auflistet - sprich: Verzeichnisse und alle Unterverzeichnisse.
Jetzt könnte ich ja theoretisch mehrere Wege beschreiten ...

z. B. indem ich mit dem Linux-Command "ls" arbeite und die Ausgabe in PHP weiterverarbeiten oder ich kann eine sich selbst aufrufende Funktion schreiben.

Eine einfache Liste zu bekommen ist relativ einfach. Diese aber auch brauchbar anzuwenden, ist eine andere Sache. Ich habe viele Varianten ausprobiert, aber ich bin nie so recht damit zufrieden.

Eigentlich wäre eine Array-Struktur perfekt:
(ich hoffe das board stellt das richtig dar ...)
Code:
root:
/ 
|
|---ordner1--
|			|
|			|- Ordner 1.1
|			|- Ordner 1.2
|
|
|---ordner2--
|			|
|			|- Ordner 2.1
|			|- Ordner 2.2
|			|- Ordner 2.3---
|			|				|- Ordner 2.3.1
|							|- Ordner 2.3.2

Im Moment sind mir mehrere Wege bekannt das zu erreichen.
z. B. über Explode die komplette Verzeichnis-Liste umständlich zu verarbeiten.

Ich bin gespannt darauf, wie ihr vorgehen würdet.
Der Code sollte so einfach und kurz wie möglich sein.
Wie würdet ihr Anfangen und welche weiteren Wege würdet ihr nehmen?
 
Also, wie genau ich es angehen könnte, kann ich dir (noch) nicht sagen, da mich erstmal ein kleines Problemchen mit dem Array an sich plagt und zwar folgendes:

Angenommen du hast ein mehrdimensionales Array. Gehen wir im Beispiel mal von einfachen zwei Dimensionen aus. Dann hättest du z.B.

$filearray[ordner1][unterordner1]
$filearray[ordner1][unterordner2]
$filearray[ordner1][unterordner3]

Aber wo packst du jetzt die Dateien hin, die in ordner1 liegen ? Auch in eigene Elemente, da du $filearray[ordner1] ja keinen Wert zuweisen kannst ?

Und was für Werte weist du den Elementen zu ? Oder reicht es dir schon, dass die Elemente die Dateistruktur aufweisen ?

Ansonsten ließe sich das ganze sicherlich dynamisch erzeugen, wenn man die Funktion von PHP nutzt, Variablen folgendermaßen zu deklarieren
${Strings und andere Variablen hier rein}

Evtl. hat dir das letzte etwas geholfen, obwohl ich davon überzeugt bin, dass du das schon kanntest. ;)

Naja mal sehen, zu was der Thread hier führt.

mfG
ein gespannter Tim
 
Aber wo packst du jetzt die Dateien hin, die in ordner1 liegen ? Auch in eigene Elemente, da du $filearray[ordner1] ja keinen Wert zuweisen kannst ?

Ah, eines meiner Probleme :-)

Theoretisch könnte ich ein "Koordinatensystem" - oder besser "Ebenenmodell" - verwenden. Ich lasse lasse die Ebenen auflisten und sortiere Ordner und Dateien getrennt aus - in 2 Arrays. Das ergäbe z. B.:

PHP:
$arr_scructure[ebene1][ordner1][ordner1];
$arr_scructure[ebene1][ordner1][ordner2];
$arr_scructure[ebene1][ordner2][ordner1];
$arr_scructure[ebene1][ordner2][ordner2];
$arr_scructure[ebene1][ordner2][ordner3];
$arr_files[ebene1][datei1]
$arr_files[ebene1][datei2];
$arr_files[ebene1][datei3];

$arr_scructure[ebene2][ordner1][ordner1];
$arr_scructure[ebene2][ordner1][ordner2];
$arr_scructure[ebene2][ordner2][ordner1];
$arr_files[ebene2][datei1];

So könnte ich jede Ebene ansteuern und Ordner und Dateien selbiger aufgelistet bekommen.

${Strings und andere Variablen hier rein}
Ja, diese Art der Deklaration ist mir nicht unbekannt. Womit ich jedoch ein Problem habe sind Multidimensionale Arrays (ich glaube jedenfalls das ich ein Problem damit habe, weil mir alles was mir einfällt unsinnig vorkommt). Bisher, gebe ich beschämt zu, habe ich mich von multi-arrays ferngehalten.
Ich glaube das hatte einen guten Grund :-)
 
sortiere Ordner und Dateien getrennt aus - in 2 Arrays
Die Aussage 2 Arrays ist hier auch äusserst gewagt, betrachtet man folgenden Umstand:

Nach deiner Auflistung hast du in $array_scructure sämtliche Verzeichnisse. In
$arr_files[ebene1][datei1] bekommst du jedoch nur Dateien unter, die ein Verzeichnis von der root-Ebene entfernt sind. Was ist mit den Dateien direkt in der root-Ebene ? Was ist mit Dateien, die zwei oder mehr Verzeichnisse von der root-Ebene entfernt sind ? Du bräuchtest weitere Arrays dafür.

Also bevor sich das ganze verläuft, frage ich einfach mal, was hast du damit vor ? Evtl. gibt es eine "bessere" Lösung.

//edit:
Das einzige was mit einfallen würde, wäre, du schreibst alle in ein Array, also beispielsweise.
Code:
$array[root][verz1]...
$array[root][file1]
Nun könntest du einfach einem Element, dass eine Datei ist, den Wert file oder datei geben und dann später checken, ob der Inhalt eines gewählten Elements ein Array enthält, dann handelt es sich um ein Verzeichnis oder den gesetzten String (datei/file/usw) enthält, dann handelt es sich um eine Datei.

Evtl. hat das System aber auch noch seine Schwächen, die ich im Moment nicht sehen kann.
 
Zuletzt bearbeitet:
-

Ein Array zur Abbildung des Dateisystems zu benutzen, halte ich für zu unübersichtlich. Da es in PHP aber nur eine vernünftige Möglichkeit gibt, verschiedene Daten als Struktur zu speichern, würde ich dir hier Klassen empfehlen.

Das Dateisystem ist ja eine große Baumstruktur, welche auf jeder Ebene das gleiche Schema besitzt. Es gibt eine Liste von normalen Dateien und eine Liste von weiteren Verzeichnissen, die gleichzeitig die Knoten für die weiteren Ebenen bilden.

Du schreibst dir nun also eine Klasse, die eine Ebene abbilden kann. Also ein Array für die gesamten Dateien in dem Verzeichnis und ein Array für die weiteren Verzeichnisse, wo du die Instanzen der tieferliegenden Verzeichnisse speicherst. Dadurch entsteht dann eine Baumstrutktur, die mit den möglichkeiten von PHP einigermaßen gut zu verarbeiten ist und die Realität ziemlich gut abbildet.
 
Ja Patrick, zur simplen Ausgabe hätte ich sowas auch angestrebt, da ich aber nicht genau wusste, was er damit anstellen wollte und er schon auf dem Array Zug aufgesprungen war, dachte ich verfolgen wir die Idee erstmal. ;)
 
Ich glaube ich habe mich mal wieder mißverständliche ausgedrückt.
Das ist mir angeboren :-)

Das einzige was mit einfallen würde, wäre, du schreibst alle in ein Array, also beispielsweise.

So habe ich das gemeint:
Root = Ebene 1 in meinem Beispiel
Root/sub = Ebene 2
Root/sub/sub = Ebene3

@Patrick Kamin:
Ich habe auch nicht alles in EIN Array speichern wollen. Auch wenn das so klingt ;) Aber so wie Du es beschrieben hast, scheint mein Beispiel richtig zu sein.
Ich habe jetzt mal absichtlich die Methode zum Einlesen weggelassen. Ob Funktion oder Klasse, spielt im Moment keine Rolle. Ich wollte bloss wissen ob meine Idee gut ist, oder ob es bessere Möglichkeiten gibt.

Der Ebenen-Gedanke schien mir ein guter Weg zu sein.



--- :-)
Wenn ich alles in ein einzige Array schreiben wollen würde, dann würde das simple Beispiel von php.net vollkommen genügen.


*Argh* ich geb dir gleich Vorname + Nachname hinter die Löffel Herr Patrick Kamin ... *grrr*

Aus diesem Grund bleibe ich lieber Neuro
Und aus Paranoia ... :rolleyes:
 
Wenn alles in ein Array soll, dann wäre mein Vorschlag folgender:
PHP:
Array
(
    "verzeichnis1" => Array
                      (
                          "Verzeichnis1.1" => Array
                                              (
                                                  "datei1.1.1" => "file",
                                                  "datei1.1.2" => "file",
                                                  "datei1.1.3" => "file"
                                              ),
                          "Verzeichnis1.2" => Array
                                              (
                                                  [...]
                                              ),
                          "datei1.1"       => "file",
                          "datei1.2"       => "file"
                      ),
    "verzeichnis2" => Array
                      (
                          [...]
                      ),
    "datei1"       => "file",
    "datei2"       => "file",
    "datei3"       => "file"
)
 
Zurück