Verzeichnisstruktur + zus. Infos in multid. Array + sortieren
Gunther
- php
Hallo Selfforumer!
Ich brauche mal bitte die Hilfe von euch PHP-Profis.
Folgende Zielsetzung:
Ich möchte aus einem bestimmten Verzeichnis die Verzeichnisstruktur (also die vorhandenen Unterverzeichnisse und sämtliche darin enthaltenen Dateien mit beliebiger Tiefe) auslesen, um daraus später per HTML (<ul>'s & <li>'s) ein Menü zu erstellen.
Zusätzlich möchte ich zu jedem Element noch weitere Infos abspeichern (vorzugsweise über String Schlüssel).
Eine dieser zusätzlichen Infos ist eine Ganzzahl, die bei der Sortierung der Elemente später die Reihenfolge festlegen soll. Dieser Wert ist anfangs für alle Elemente 0 und auch später "optional" (oder bleibt eben 0).
Die Sortierung soll in der Weise erfolgen, dass zuerst pro Ebene die Einträge kommen, deren Wert != 0 ist (in entsprechender numerisch aufsteigender Reihenfolge) und anschließend die Einträge mit dem Wert 0 in alphabetischer Reihenfolge.
Wie baue ich mein(e) Array(s) am besten auf und wie erreiche ich am einfachsten die gewünschte Sortierung?
Ich bin für jede Hilfe dankbar!
Gruß Gunther
Hello,
Wie baue ich mein(e) Array(s) am besten auf und wie erreiche ich am einfachsten die gewünschte Sortierung?
Wie man mit "Spaltenarrays" am simpelsten umgehen kann, habe ich hier schon mehrfach beschrieben.
Da es sich um gebundene Informationen handelt, bietet sich der Aufbau an.
Viel interessanter dürfte sein, wie und wo Du die Zusatzinformationen speichern willst, die an die Dateinamen (oder besser die Dateien) gebunden werden sollen.
Harzliche Grüße vom Berg
http://www.annerschbarrich.de
Tom
Hello Tom,
na da habe ich wohl eines deiner "Lieblingsthemen" erwischt ;).
Wie baue ich mein(e) Array(s) am besten auf und wie erreiche ich am einfachsten die gewünschte Sortierung?
Wie man mit "Spaltenarrays" am simpelsten umgehen kann, habe ich hier schon mehrfach beschrieben.
Hmmm ..., also ich habe da jetzt mittels der Forumssuche u.a. folgendes zu gefunden:"..., denn meine vielfach vorgeschlagene Lösung des "Spaltenarray" (Suchbegriff für die Archiv-Suche) ist nur ganz wenigen eingängig, aber trotzdem meistens ungemein praktisch ;-)"
Leider scheine ich nicht zu den ganz wenigen zu gehören ...!
Da es sich um gebundene Informationen handelt, bietet sich der Aufbau an.
Viel interessanter dürfte sein, wie und wo Du die Zusatzinformationen speichern willst, die an die Dateinamen (oder besser die Dateien) gebunden werden sollen.
Ja, das war und ist ja der Hauptteil meiner Frage (siehe auch Antwort auf wahsagas Posting).
Es wäre sehr nett von dir, wenn du mir diesbezüglich noch etwas auf die Sprünge helfen würdest - Danke!
Gruß Gunther
Hello,
Viel interessanter dürfte sein, wie und wo Du die Zusatzinformationen speichern willst, die an die Dateinamen (oder besser die Dateien) gebunden werden sollen.
Ja, das war und ist ja der Hauptteil meiner Frage (siehe auch Antwort auf wahsagas Posting).
Es wäre sehr nett von dir, wenn du mir diesbezüglich noch etwas auf die Sprünge helfen würdest - Danke!
Dazu müsstest Du wahrscheinlich einfach Deine Anforderungen an das zu erstellende System spezifizieren. Da ich nicht annehme, dass Du einen Eingriff in das Betriebssystem bzw. dessen Filesystem programmieren willst, kannst Du die zusätzlichen Informationen ja nur huckepack andocken.
Da sollte man dann aber auch überlegen, ob eine Änderung der Ressource auch eine Änderung der Huckepackdaten zur Folge hätte. Dann dürftest Du Deine Ressourcen nämlich nur noch über ein spezielles API oder Gateway bedienen.
Außerdem solltest Du Dir klarmachen, dass im Web der gesamte Aufwand ggf. pro Klick erneut getrieben werden muss. Man sollte daher immer möglichst nur Ausschnitte des Ganzen im Detail zeigen, bzw. nur grobe Übesichten über das Untergeordnete. Erst wenn Du tatsächlich ins Detail gehst, solltest Du das auch aufbereiten lassen.
Soviel zur Philosophie.
Harzliche Grüße vom Berg
http://www.annerschbarrich.de
Tom
Hello,
Viel interessanter dürfte sein, wie und wo Du die Zusatzinformationen speichern willst, die an die Dateinamen (oder besser die Dateien) gebunden werden sollen.
Ja, das war und ist ja der Hauptteil meiner Frage (siehe auch Antwort auf wahsagas Posting).
Es wäre sehr nett von dir, wenn du mir diesbezüglich noch etwas auf die Sprünge helfen würdest - Danke!
Dazu müsstest Du wahrscheinlich einfach Deine Anforderungen an das zu erstellende System spezifizieren. Da ich nicht annehme, dass Du einen Eingriff in das Betriebssystem bzw. dessen Filesystem programmieren willst, kannst Du die zusätzlichen Informationen ja nur huckepack andocken.
Das habe ich doch jetzt in dem Thread hier schon ausführlichst getan?
Die zusätzlichen Informationen sind ja entweder bereits existent oder kommen aus entsprechenden Benutzereingaben (wie bspw. die Sortiernr.). Oder welche "Anforderungen" meinst du!?
Da sollte man dann aber auch überlegen, ob eine Änderung der Ressource auch eine Änderung der Huckepackdaten zur Folge hätte. Dann dürftest Du Deine Ressourcen nämlich nur noch über ein spezielles API oder Gateway bedienen.
Die Ereignisse, die die Daten des Arrays ändern, kriegt man schon mit. In diesem Fall würde die Funktion aufgerufen, die das Array neu erstellt. Ansonsten werden die entsprechenden Änderungen der "Huckepack" Daten direkt in das Array übernommen.
Außerdem solltest Du Dir klarmachen, dass im Web der gesamte Aufwand ggf. pro Klick erneut getrieben werden muss. Man sollte daher immer möglichst nur Ausschnitte des Ganzen im Detail zeigen, bzw. nur grobe Übesichten über das Untergeordnete. Erst wenn Du tatsächlich ins Detail gehst, solltest Du das auch aufbereiten lassen.
Das ist mir schon klar. Die Daten des Arrays dürften sich nicht all zu oft ändern. Es soll in serialisierter Form in einer Datei gespeichert werden.
Das Menü, welches aus den Daten des Arrays erstellt wird, muss bei jedem Klick neu generiert werden. Wenn sich aber zwischenzeitlich keine Änderung der Daten des Arrays ergeben haben, ist der resultierende HTML Code ja auch unverändert und ich gehe somit davon aus, dass dieser gecacht werden kann.
Soviel zur Philosophie.
Ja - nur bin ich jetzt in der Praxis noch kein Stück weiter ... ;)!
Kölnische Grüße aus Köln
Gunther
hi,
Ich möchte aus einem bestimmten Verzeichnis die Verzeichnisstruktur (also die vorhandenen Unterverzeichnisse und sämtliche darin enthaltenen Dateien mit beliebiger Tiefe) auslesen, um daraus später per HTML (<ul>'s & <li>'s) ein Menü zu erstellen.
http://www.php-faq.de/q/q-code-verzeichnis.html
wie erreiche ich am einfachsten die gewünschte Sortierung?
usort()
gruß,
wahsaga
Hi wahsaga,
Ich möchte aus einem bestimmten Verzeichnis die Verzeichnisstruktur (also die vorhandenen Unterverzeichnisse und sämtliche darin enthaltenen Dateien mit beliebiger Tiefe) auslesen, um daraus später per HTML (<ul>'s & <li>'s) ein Menü zu erstellen.
http://www.php-faq.de/q/q-code-verzeichnis.html
wie erreiche ich am einfachsten die gewünschte Sortierung?
usort()
danke für deine Antwort.
Ich hätte es vielleicht doch besser dazuschreiben sollen: Mir geht es weniger um spezielle PHP Funktionen als solches, noch um die Frage, wie ich bspw. eine Rekursion hinbekomme. Meine Frage zielte eher in die Richtung wie ich die Daten (am besten/ sinnvollsten/ einfachsten) "strukturiere". Also z.B. ob es sinnvoll/ leichter/ besser wäre, Verzeichnisse und Dateien in zwei separaten Arrays zu speichern, oder wie viele Dimensionen mit welchen Schlüsseln wären am besten, etc.!
Gruß Gunther
hi,
Meine Frage zielte eher in die Richtung wie ich die Daten (am besten/ sinnvollsten/ einfachsten) "strukturiere".
Dann stelle deine diesbezüglichen Gedankengänge doch hier zur Diskussion.
gruß,
wahsaga
hi,
Meine Frage zielte eher in die Richtung wie ich die Daten (am besten/ sinnvollsten/ einfachsten) "strukturiere".
Dann stelle deine diesbezüglichen Gedankengänge doch hier zur Diskussion.
Also dann gehe ich die Sache mal rückwärts an:
Ich hätte gerne am Ende nach Möglichkeit ein einziges multidimensionales Array, welches in der gewünschten Reihenfolge, eine komplette Verzeichnisstruktur beliebiger Tiefe, mit folgenden Infos
Mein erster Ansatz war folgender:
Ich habe die Verzeichnisse in ein Array eingelesen
$Verz[fortl. Nr.][Level][Zähler Verz.]
Die Dateien in ein separates Array
$Datei[fortl. Nr. aus $Verz][Level-1][Zähler Verz.][Zähler Datei]
Die fortlaufende Nummer ergibt sich also anhand der Verzeichnisse auf der ersten Ebene der Verzeichnisstruktur und bildet die Verbindung zwischen den Elementen beider Arrays.
Mein Hauptproblem bei diesem Ansatz besteht in erster Linie in der Sortierung der Arrays und in ihrer Zusammenführung zu einem Array.
Gruß Gunther
hi,
Mein Hauptproblem bei diesem Ansatz besteht in erster Linie in der Sortierung der Arrays
Wie gesagt, usort().
Schreibe dir eine Vergleichsfunktion, der du ein Array (eine Ebene) übergibst, und die zwei Elemente aus diesem anhand definierter Kriterien vergleicht.
Ggf. rekursive Anwendung.
und in ihrer Zusammenführung zu einem Array.
Warum denn überhaupt erst zwei Arrays?
Unterordner sind auch nur "Dateien" - nur dass diese wiederum Dateien und Unterverzeichnisse enthalten können.
Eine objektorientierte Herangehensweise bietet sich eigentlich an.
gruß,
wahsaga
hi,
und in ihrer Zusammenführung zu einem Array.
Warum denn überhaupt erst zwei Arrays?
Unterordner sind auch nur "Dateien" - nur dass diese wiederum Dateien und Unterverzeichnisse enthalten können.
Eine objektorientierte Herangehensweise bietet sich eigentlich an.
Weil ich sonst in dem Array auch noch den Typ abspeichern müsste (Verz. oder Datei), denn in dem Menü kommen erst Verzeichnisse und dann Dateien. Ausserdem brauche ich ja eine "Zuordnung", welche Dateien zu welchem Verzeichnis gehören (Elternelement).
Also die Datenstruktur muss eine spätere Sortierung nach
-> Verzeichnisse nach Sortiernr. aufsteigend -> Dateien nach Sortiernr. aufsteigend ermöglichen. Wobei jeweils alle Verzeichnisse und Dateien ohne Sortiernr. nach denen mit einer entsprechenden Nummer in alphabetischer Reihenfolge kommen müssen.
Also ich befürchte ohne konkretes Beispiel à la
$array[Schlüssel 1 = xy][Schlüssel 2 = ab][Schlüssel 3 = cd]
kapier' ich das nicht ... :-( !
Gruß Gunther
hi,
Weil ich sonst in dem Array auch noch den Typ abspeichern müsste (Verz. oder Datei),
Ja, und?
denn in dem Menü kommen erst Verzeichnisse und dann Dateien.
Gut, dann fliesst dieses Kennzeichen also in den beim Sortieren gemachten Vergleich mit ein.
Ausserdem brauche ich ja eine "Zuordnung", welche Dateien zu welchem Verzeichnis gehören (Elternelement).
Deshalb ja eine mehrdimensionale Struktur.
Ein Ordner hat eine Eigenschaft "Kinder" (oder childs oder Inhalt oder wasauchimmer) - ein Array, in dem dann wiederum Ordner und Dateien liegen.
Also die Datenstruktur muss eine spätere Sortierung nach
-> Verzeichnisse nach Sortiernr. aufsteigend -> Dateien nach Sortiernr. aufsteigend ermöglichen. Wobei jeweils alle Verzeichnisse und Dateien ohne Sortiernr. nach denen mit einer entsprechenden Nummer in alphabetischer Reihenfolge kommen müssen.
Mit einer passenden Vergleichsfunktion sollte das kein problem sein.
gruß,
wahsaga