Felix Riesterer: multidimensionales Array sortieren...

Liebe Selfer,

ich stehe vor einem (noch?) unlösbaren Problem. Um die Navigation auf meiner Seite zu vollautomatisieren, habe ich mir ein Script geschrieben, dass mir die Struktur der Navigation ermittelt und in ein mehrdimensionales Array abbildet. Dieses Array soll später zu einer Navigationsliste umgebaut werden, die dann per CSS als Navigation auf der Seite ... alistapart ... Ihr wisst schon.
Dieses Array will ich nun "sortieren", komme aber nicht weiter. Die auf php.net verfügbaren Funktionen (insbesondere usort, uasort, uksort) scheinen nicht auszureichen...

Die Struktur des Arrays im Kurzformat:
$navi_array = array(
                   "Rubrik3" => array(
                                      "Eintr.3" => array(),
                                      "Eintr.1" => array(
                                                         "unt.Eintr.2" = array(),
                                                         "unt.Eintr.3" = array(),
                                                         "unt.Eintr.1" = array(),
                                                         ),
                                      "Eintr.4" => array(),
                                      "Eintr.2" => array(),
                                     ),
                   "Rubrik1" => array(...),
                   "Rubrik2" => array(...),
                   "Rubrik4" => array(...),
                   );

Soweit so gut. Das "kleine" Problem ist, dass die Rubriken, als auch einige der "Eintr.x"e eine bestimmte Reihenfolge haben sollen, die ich in einem kleinen Array festgelegt habe. Alle Rubriken (und "Eintr."), die nicht aufgeführt sind, werden einfach trivial sortiert jeweils unterhalb angefügt.
$reihenfolge = array(
                     "Rubrik2" => array(
                                        "Eintr.4" => array(),
                                        "Eintr.3" => array(),
                                        ),
                     "Rubrik1" => array(
                                        "Eintr.2" => array(),
                                        ),
                    );

Es ist mir schon gelungen mit Hilfe von uksort und einer Vergleichsfunktion die Rubriken zu sortieren. Aber bei den "Eintr."-Arrays komme ich nicht weiter. usort, sowie auch uasort wollen dann das Array zu "Rubrik1" mit dem Array zu "Rubrik4" vergleichen... was mir ja nix bringt, da ich die _Schlüssel_ _innerhalb_ meiner Rubriken-Arrays vergleichen will, und nicht die Arrays von verschiedenen Schlüsseln miteinander. Nur...

Wie komme ich da dran?

Hoffentlich konnte ich mein Problem verständlich machen.

Vielen Dank schon fürs Durchlesen! und noch viel mehr Dank für gute Tipps und aufmunternde Ratschläge! :-)

Liebe Grüße aus Ellwangen,

Felix Riesterer.

  1. Hallo,
    ohne den Post gelesen zu haben:

    Mit usort(); kann man mehrdimensionale Arrays sortieren.

    Schau mal ins PHP Manual + Selfphp da sind Beispiele.

    MFG
    Andavos

    1. Lieber Andavos,

      soweit war ich schon... Aber danke!

      Liebe Grüße aus Ellwangen,

      Felix Riesterer.

      1. Der Trick bei merhdimensionalen Arrays, ist wie bei binären Bäumen etc. die Rekursion. Da man nie weiß wie tief die 'Verzeigungen' sind braucht man eine Funktion, die sich selber aufruft, wenn noch ein 'Zweig' oder ein 'Blatt' kommt.
        Google mal nach rekursive Funtionen und PHP oder array rukursiv und PHP, ich denke da müßtest Du fündig werden.
        Wenn Du dann nicht weiterkommst poste nochmal.

        Viele Grüße

        Sasha

        1. Lieber Sasha,

          das mit meinem Array ist so: Immer schön nach Schlüsseln suchen, da nur die Schlüssel tatsächlich meine Informationen enthalten! In den Arrays stehen ja keine Werte...

          Also folgere ich messerscharf: uksort() will ich benutzen!

          Dass ich dann mein Array immer tiefer in seine Verschachtelungen untersuchen muss, das habe ich inzwischen auch gemerkt. Aber auch dort muss ich mit uksort sortieren, denn ich habe ja nur Schlüssel und keine Werte in meinen Arrays stehen. :-)

          Vielen Dank für die Idee mit der Rekursion. Aber ich mache das lieber iterativ, da ich nicht das _komplette_ Array sortieren möchte, sondern nur bestimmte Ebenen, und die nicht wirklich vollständig.

          Liebe Grüße aus Ellwangen,

          Felix Riesterer.

  2. Es ist mir schon gelungen mit Hilfe von uksort und einer Vergleichsfunktion die Rubriken zu sortieren. Aber bei den "Eintr."-Arrays komme ich nicht weiter. usort, sowie auch uasort wollen dann das Array zu "Rubrik1" mit dem Array zu "Rubrik4" vergleichen... was mir ja nix bringt, da ich die _Schlüssel_ _innerhalb_ meiner Rubriken-Arrays vergleichen will, und nicht die Arrays von verschiedenen Schlüsseln miteinander. Nur...

    Wie komme ich da dran?

    Wenn du nicht uksort($navi_array['RubrikX'], 'sort_function') suchst, dann verstehe ich deine Problembeschreibung nicht.

    Oder meinst du etwa, dass du Eintr.X'e von RubrikY nach RubrikZ verschieben willst?