M_Müller: Mehrdimensionale, dynamische Arrays sortieren

Hallo,

ich habe folgendes Problem:
Für meine Userverwaltung habe ich folgende Tabellen:
    - user
    - user_rel_profile
    - user_profile
    - user_rel_groups
    - user_groups
In user sind alle User mit einer ID versehen und das Passwort wie auch das Registrierungsdatum wird gespeichert.
In user_profile sind die Profilkategorien gespeichert. Diese werden in user_rel_profile zugeordnen. Genauso bei user_groups.

Nun möchte ich der Funktion aber einfach sagen z.B. "sortiere nach user_id"  oder auch nach "profil_vorname" oder so.
Als Resultat soll ein multidimensionales Array herauskommen nach dem Schema:
    - User
      - user_id
      - user_profile
        - Array mit Profildaten
      - user_groups
        - Array mit Usergruppen

Mein Problem liegt jetzt aber in der Sortierung. Ich möchte das Array sowohl nach Usergruppen als auch nach user-ID, als auch nach verschiedenen Profildaten sortieren lassen und das kriege ich nicht hin.

Wäre nett wenn ihr mir helfen könnt.

danke schonmal
Michael

  1. echo $begrüßung;

    Nun möchte ich der Funktion aber einfach sagen z.B. "sortiere nach user_id"  oder auch nach "profil_vorname" oder so.

    Das ist ein immer wieder auftauchendes Problem. PHP hat Sortierfunktionen für Arrays

    Als Resultat soll ein multidimensionales Array herauskommen nach dem Schema:
        - User
          - user_id
          - user_profile
            - Array mit Profildaten
          - user_groups
            - Array mit Usergruppen

    Für mich ist eine Dimension etwas, das von einem Punkt ausgehend kontinuierlich in eine bestimmte Richtung aufsteigt. Das was du hier darstellst ist ein ineinander geschachteltes Gebilde beliebiger Daten, das eher einer Baumstruktur entspricht. Wenn du dir dessen bewusst wirst, dass du _ein_ Array vorliegen hast, dessen Elemente eine komplexe Struktur (User) darstellen, dann könntest du feststellen, dass ein Vergleich von zweien dieser Elemente anhand eines bestimmten Merkmals dieser komplexen Struktur namens User stattfinden muss.

    z.B.:  $user[x]->profile->datum  vs.  $user[y]->profile->datum

    Und genau so eine Vergleichsfunktion musst du selbst schreiben und kannst sie dann zusammen mir deinem Array einer der u*sort-Funktionen übergeben.

    echo "$verabschiedung $name";

    1. Hallo dedlfix,

      Für mich ist eine Dimension etwas, das von einem Punkt ausgehend kontinuierlich in eine bestimmte Richtung aufsteigt. ...

      Da stimme ich aber nicht zu.

      Bei Arrays gibt die Dimension an, wieviele Indizes benötigt werden, um ein Element anzusprechen: a[i][j][k] ist ein Element eines dreidimensionalen Arrays.

      In der Geometrie ist eine Linie eindimensional, eine Fläche zweidimensional und ein Volumen dreidimensional. Die Dimension gibt hier an, wieviele Koordinaten man benötigt, um einen Punkt im Raum zu bestimmen.

      Für die Physiker gibt es dann noch das vierdimensionale Raum-Zeit-Gebilde. Über die noch höherdimensionalen Strings schweige ich lieber, da fehlt mit die Anschauung.

      Kontinuierlich ist da nichts, es sei denn, du meinst die nicht ganzzahligen Dimensionen aus der Chaos-Theorie.

      Gruß, Jürgen

      1. echo $begrüßung;

        Für mich ist eine Dimension etwas, das von einem Punkt ausgehend kontinuierlich in eine bestimmte Richtung aufsteigt. ...

        Da stimme ich aber nicht zu.

        Bei Arrays gibt die Dimension an, wieviele Indizes benötigt werden, um ein Element anzusprechen: a[i][j][k] ist ein Element eines dreidimensionalen Arrays.

        $x = array(
          'a' => array(
            'b' => 'c',
            'd' => 'e',
          ),
          'f' => array(
            'g' => array(
              'h' => 'i',
              'j' => 'k',
          ),
          'l' => 'm',
        );

        Um 'e' anzusprechen braucht man $x['a']['d'], für 'i' aber $x['f']['g']['h'], und 'm' erreicht man mit $x['l']. Wieviel dimensional ist nun $x? Was wäre, wenn einige der Elemente keine Arrays sondern Objekte sind, deren Eigenschaften ebenfalls wieder Skalar, Array oder Objekt sein können? Ob nun ->foo oder ['foo'] zum Ansprechen der Elemente genommen werden muss, ... für mich bleibt so etwas ein unregelmäßiges Gebilde und nichts was Dimensionen hat.

        $y = array(
              array('a', 'b', 'c'),
              array('d', 'e', 'f'),
              array('g', 'h', 'i'),
              array('j', 'k', 'l'),
        );

        $y kann ich die Bezeichnung zweidimensional geben. Aber nur solange nicht eins der Elemente mit unset() entfernt wird (weil es dann ein Dimensionsloch gibt, das ja bekanntlich nach Gennf riecht ...)

        Trotzdem ist $y genauer betrachtet nur _ein_ PHP-Array, auch wenn dessen Elemente jeweils die gleiche Abmessung haben.

        In der Geometrie ist eine Linie eindimensional, eine Fläche zweidimensional und ein Volumen dreidimensional. Die Dimension gibt hier an, wieviele Koordinaten man benötigt, um einen Punkt im Raum zu bestimmen.

        Ja, aber diese Gebilde sind regelmäßig und ohne Lücken. Die Linie hat kontinuierlich aneinandergereiht Punkte von a bis b, usw. usf.

        Ich sträube mich dagegen, ein Array, dessen Elemente Datensätze darstellen sollen, als wieauchimmerdimensional zu bezeichnen, weil das meiner Meinung nach den Blick auf die eigentliche Struktur vernebelt und das Finden von Lösungsansätzen für solche Probleme wie die des OP erschwert.

        "Ich habe ein multidimensionales Array. Wie sortiere ich denn das jetzt? Brauch ich womöglich räumliches Vorstellungsvermögen?"

        "Nein, denn es ist nur _ein_ Array mit (komplexen) Elementen drin. Eine Sortierung erreicht man durch einfache Vergleiche zweier Elemente (bzw. von Teilaspekten dieser Elemente), zuzüglich einer PHP-Funktion, die das Neuordnen übernimmt."

        echo "$verabschiedung $name";