Ordner strukturieren

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

  • Ordner strukturieren

    Hi!

    Ich habe ein Array mit Ordnern, welches wie folgt aufgebaut ist:

    Quellcode

    1. Array
    2. (
    3. [0] => Array
    4. (
    5. [name] => root
    6. [id] => 0
    7. [parent_folder] =>
    8. )
    9. [1] => Array
    10. (
    11. [name] => img1
    12. [id] => 1
    13. [parent_folder] => 0
    14. )
    15. [2] => Array
    16. (
    17. [name] => img2
    18. [id] => 2
    19. [parent_folder] => 0
    20. )
    21. [3] => Array
    22. (
    23. [name] => files
    24. [id] => 3
    25. [parent_folder] => 0
    26. )
    27. [4] => Array
    28. (
    29. [name] => private
    30. [id] => 4
    31. [parent_folder] => 3
    32. )
    33. [5] => Array
    34. (
    35. [name] => funny
    36. [id] => 9
    37. [parent_folder] => 3
    38. )
    39. )
    Alles anzeigen

    d.h.: In Dem Array sind die Ordner als Array gespeichert. Bei jeden Ordner sind id, name und parent_folder gegeben.

    Nun möchte ich diese Ordner in einem neuen Array ordnen:

    Quellcode

    1. Array
    2. (
    3. [0] => array
    4. (
    5. [name] => files
    6. [id] => 3
    7. [subfolders] => array
    8. (
    9. [0] => array
    10. (
    11. [name] => private
    12. [id] => 4
    13. [subfolders] => none
    14. )
    15. [1] => array
    16. (
    17. [name] => funny
    18. [id] => 9
    19. [subfolders] => none
    20. )
    21. )
    22. )
    23. [1] => array
    24. (
    25. [name] => img1
    26. [id] => 1
    27. [subfolders] => none
    28. )
    29. [2] => array
    30. (
    31. [name] => img2
    32. [id] => 2
    33. [subfolders] => none
    34. )
    35. )
    Alles anzeigen


    Die Ordner der Tiefe 1 (Unterordner von root) werden in alphabetischerr reihenfolge in das array geschrieben - als Array mit name, id und subfolders.
    subfolders ist wieder ein array mit dem gleichen Aufbau, wo die Unterordner in der gleichen Struktur angegeben sind.
    Die Verschachtelung kann beliebig tief sein.

    Ich wollte dazu eine Funktion schreiben, die sich rekursiv selbst aufruft und so einen ordner ins array schreibt und dann rekursiv immer die unterordner.
    Das ist meine Idee, die ich ausprobieren werde. falls jemand noch nen heissen Tipp, hat wäre ich dankbar! ;)

    Grüße,
    Max123
  • Hier meine Lösung:

    Quellcode

    1. function get_folder_structure($folders) {
    2. $structure = array(); //das soll gefüllt werden
    3. @sort($folders); //somit sind alle Ordner direkt alphabetisch sortiert
    4. //rekursive Funktion
    5. function structure_rek($parent_folder,$folders) {
    6. foreach ($folders as $tmp) {
    7. if ($tmp['parent_folder'] == $parent_folder) {
    8. //der rekursive Schritt -> die Unterordner finden
    9. $subfolders = structure_rek($tmp['id'],$folders);
    10. //einen Wert zuweisen, wenn keine Unterordner vorhanden sind
    11. //dies vereinfach die spätere Nutzung des Arrays
    12. if (!isset($subfolders)) {
    13. $subfolders = 'none';
    14. }
    15. //alles zusammensetzten
    16. $current[] = array('name' => $tmp['name'], 'id' => $tmp['id'], 'subfolders' => $subfolders);
    17. }
    18. }
    19. return $current;
    20. }
    21. //Der erste Schritt
    22. if (is_array($folders)) { //Fehler abfangen, wenn keine Ordner vorhanden sind
    23. //der 'root' Ordner hat immer die ID 0,
    24. //daher werden im ersten Schritt desssen Unterordner gesucht
    25. $structure = structure_rek(0,$folders);
    26. }
    27. return $structure;
    28. }
    Alles anzeigen

    Diese Verwendung setzt bestimmte Eigenschaften der Ordnerstrukturierung voraus, ist daher nicht allgemein einsetzbar, aber leicht anzupassen.

    Das einzige, was mich noch stört:

    Quellcode

    1. function structure_rek($parent_folder,$folders)

    Ich muss immer alle Ordner mit übergeben. Das frisst unnötig Speicherplatz. Kann man dies anders gestalten?

    Die Ausgabe erfolgt recht ähnlich - auch rekursiv. Hab mal nen Screen davon angehängt.
    Bilder
    • folder.jpg

      5,87 kB, 215×122, 566 mal angesehen
  • versuchs mal ohne das Fragezeichen in der Parameterliste.
    Es handelt sich um eine Referenz.
    Intern wird also kein neuer Speicher allokiert

    Aber wenn ich ganz ehrlich bin, habe ich noch nie ein php-buch gelesen, weiß daher nicht genau wie es im hintergrund arbeitet..

    bei java kostet es z.B. immer viel Performance neue Arrays zu erstellen, da diese bei Initialisierung mit Default Werten gefüllt werden
  • referenzen sind von nutzen, wenn man folgendes schreiben wollte:

    Quellcode

    1. $variable = funktion($variable);


    Wenn man der Funktion eine Referenz hinzufügt, also ein &, dann muss man das ganze nur noch so schreiben:

    Quellcode

    1. funktion($variable);


    Hab nämlich eben grad ne Funktion geschrieben und mir Gedanken gemacht, wie man das optimieren kann, und dann hats Klick gemacht - jetzt weiß ich endlich, wozu die Referenzen gut sind :D
  • ok, ganz so einfach ist es aber auch nicht:

    Quellcode

    1. function funktion(&$bla) {
    2. $bla = "blub";
    3. }
    4. funktion($variable);
    5. echo $variable;


    Gibt "blub" aus. Aber

    Quellcode

    1. echo funktion($variable);

    gibt nichts aus. ebenso ist die bedingung

    Quellcode

    1. if(funktion($variable))

    nie erfüllt.

    damit hält sich der nutzen in diesem sinne dann eigentlich in grenzen.

    edit: lösung für das if-problem -> doch ein return in die funktion einfügen:

    Quellcode

    1. return $bla;