Dateibaum in Array von Arrays abbilden

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • Dateibaum in Array von Arrays abbilden

    Hier die Lösung einer kleinen Aufgabe.
    Schreiben Sie eine PHP-Datei baum.php, die eine Textdatei liest in der je Zeile der komplette Pfad ab Wurzel / zu einer Datei steht. Parsen Sie die Textdatei in ein Array von Arrays, so dass der Dateibaum der Dateien repräsentiert wird.


    Ziel der Aufgabe war das also Parsen der Textdatei in ein Array von Arrays, so dass der Dateibaum der Dateien repräsentiert wird.

    Hier mal ein Beispiel eines solchen Abbildes:

    Quellcode

    1. [usr] => Array (
    2. [share] => Array (
    3. [include] => Array (
    4. [0] => a.h
    5. [1] => b.h
    6. )
    7. [0] => c.h
    8. )
    9. )


    Gegeben war eine Textdatei mit allen Pfaden und Dateien. Als Beispiel gebe ich mal eine Datei mit 3 Pfaden an.
    /usr/share/include/a.h
    /usr/share/include/b.h
    /usr/share/c.h


    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

    Und hier meine Lösung des Problems:

    Quellcode

    1. function path2more($e, &$arr) {
    2. if(count($e)>1) {
    3. path2more(array_slice($e, 1), $arr[$e[0]]);
    4. } else {
    5. $arr[] = $e[0];
    6. }
    7. }
    8. $file = array_map(create_function('$a', 'return explode("/", $a);'), file('textdatei.db'));
    9. $arr = array();
    10. foreach($file as $path) {
    11. path2more($path, $arr);
    12. }
    13. print_r($arr);
    Alles anzeigen
  • Hallo,
    Du hast's PHP mäßig echt drauf, die Aufgabe mit dem Dateibaum einlesen hab ich leider nicht so ganz geschnallt.

    Das "Haupt"-Array was zu füllen ist, wird immer per Referenz übergeben. Ich steh irgendwie aufm Schlauch. Wo genau wird der Hauptarray gefüllt? Zeile 3 z.B.: [...] $arr[$e[0]] [...], was passiert da genau alles? Der Code stimmt ja aus, aber wenn ich das per Hand durchgehe kommt bei mir folgender Ablauf raus:


    Nehmen wir an er soll die erste Zeile abarbeiten:
    /usr/share/include/a.h
    [...]

    Dann sind die Parameter der Funktion die rekursiv aufgerufen werden (jetzt mal nur in Pfad-Schreibweise, sind ja eigentlich Arrays):

    Aufruf aus FOR-Schleife mit ("/usr/share/include/a.h" , $arr)
    1. Rekursiver Aufruf mit ("/share/include/a.h", "usr")
    2. Rek Aufruf mit ("/include/a.h", "share")
    3. Rek Aufruf mit ("/a.h", "include")
    --> Abbruchbedingung:
    $arr[] = "a.h"

    Und dann wird rekursiv wieder abgebrochen und es geht die anderen beiden Funktionen wieder hoch und ein neuer Durchlauf der FOR-Schleife findet statt.

    Mein Prob ist jetzt zu schnallen, warum ich immer nur drauf komme, dass er am Ende den Dateinamen (hier "a.h") dann letztendlich im Array stehen hat. Irgendwo stimmt doch da was bei mir nicht?? Oder wird das Array noch irgendwo (!) bei jedem rekursiven Aufruf um einen Pfad-Abschnitt gefüllt was ich einfach nicht bemerke?

    Wäre echt dankbar für Hilfe.

    Gruß
    Manuel
  • Hi,
    $e hast du ja schon richtig analysiert. Es ist ein normales Array, das immer kleiner wird.
    $arr ist aber nur am Anfang die Referenz auf das ganze Array.
    Nach dem ersten Durchlauf ist es dann die Referenz auf $arr['usr'], dann auf $arr['usr']['share'] und am Ende auf $arr['usr']['share']['include'].
    $arr wird also auch immer kleiner.
    Funktionieren tut das Ganze weil eben nur als Referenz übergeben wird. Das drüberliegende Objekt zeigt also drauf - unabhängig wie das Objekt noch weiter aufgebaut wird.

    Meine Aktion bei Abbruch ist dann nicht weiter abzutauchen.
    Die Datei "a.h" wird also nicht mehr als Schlüssel verwendet (kein $arr['usr']['share']['include']['a.h']) sondern als Wert. Die Zuweisung sehe also im Klartext so aus:

    Quellcode

    1. $arr['usr']['share']['include'][] = 'a.h';


    Wenn jetzt ein Pfad komplett drinne ist, beginnt das Ganze wieder von vorne.
    Manche Pfade existieren schon und werden einfach erweitert. Andere werden neu angelegt, ...
  • Hi,
    ich hab's auch nicht soo elegant angefangen die Geschichte und hatte mir gleich vorab überlegt, ne Dateierkennung zu machen (was gar nicht so einfach ist, da es ja auch Dateien gibt ohne Dateierweiterung, egal ob Win oder Linux). Dazu fehlt schlicht und einfach die Information wenn man ne reine Datei mit Pfad-Zeilen zur Verfügung hat.