dey: mehrdimensionales array sortieren

Hallo,

ich habe mit miniXML eine xml datei in eine Array geparst:

  
Array  
(  
    [memberlist] => Array  
        (  
            [login] => Array  
                (  
                    [user] => 33db8bdca253bc784914bbe0d22c11fd  
                    [admin] => 310dcbbf4cce62f762a2aaa148d556bd  
                )  
  
            [member] => Array  
                (  
                    [0] => Array  
                        (  
                            [name] => Name 1  
                            [address] => Wiesbaden  
                            [phone] => 0  
                            [email] => .org  
                            [birthdate] => xxxxxx  
                            [position] =>  
                            [_attributes] => Array  
                                (  
                                    [dept] => ah  
                                )  
  
                        )  
  
                    [1] => Array  
                        (  
                            [name] => Name 2  
                            [address] =>  Wiesbaden  
                            [phone] =>  
                            [email] =>  
                            [birthdate] => xxxxxxx  
                            [position] =>  
                            [_attributes] => Array  
                                (  
                                    [dept] => ah  
                                )  
  
                        )  
  
                    [_num] => 57  
                    [2] => Array  

Dises möchte ich nun zuerst nach [dept] und dann nach [name] sortieren.
Jetzt habe ich hier eine Lösung mit vorheriger Umwandlung in weitere unter-arrays gefunden.
Das finde ich doch sehr aufwendig.
Geht es auch direkt und einfacher?

bydey

--
-- bydey ist die Signatur und Verabschiedung, nicht der Nick --
-- Navigate all your PHP web projects with  PHP Project Browser--
  1. echo $begrüßung;

    Du hast eine Baumstruktur. Das sind ineinandergeschachtelte Elemente, aber nichts, das die Bezeichnung multidimensional verdient.

    Dises möchte ich nun zuerst nach [dept] und dann nach [name] sortieren.
    Jetzt habe ich hier eine Lösung mit vorheriger Umwandlung in weitere unter-arrays gefunden.
    Das finde ich doch sehr aufwendig.
    Geht es auch direkt und einfacher?

    Verwende u*sort() mit einer selbst geschriebenen Vergleichsfunktion.

    echo "$verabschiedung $name";

  2. hi,

    Dises möchte ich nun zuerst nach [dept] und dann nach [name] sortieren.
    Jetzt habe ich hier eine Lösung mit vorheriger Umwandlung in weitere unter-arrays gefunden.
    Das finde ich doch sehr aufwendig.

    array_multisort konnte ich noch nie viel sinnvolles abgewinnen ...

    Geht es auch direkt und einfacher?

    usort + kleine selbsterstellte Vergleichsfunktion.

    gruß,
    wahsaga

    --
    /voodoo.css:
    #GeorgeWBush { position:absolute; bottom:-6ft; }
    1. Hallo,

      Geht es auch direkt und einfacher?

      usort + kleine selbsterstellte Vergleichsfunktion.

      Ähnliche Beispiele habe ich schon bei multisort gefunden.
      Aber keines hat ein so tief verschachteltes Array (max. 2 Ebenen) und keines Schlüssel in 2 unterschiedlichen Ebenen.

      bydey

      --
      -- bydey ist die Signatur und Verabschiedung, nicht der Nick --
      -- Navigate all your PHP web projects with  PHP Project Browser--
      1. hi,

        usort + kleine selbsterstellte Vergleichsfunktion.
        Ähnliche Beispiele habe ich schon bei multisort gefunden.
        Aber keines hat ein so tief verschachteltes Array (max. 2 Ebenen) und keines Schlüssel in 2 unterschiedlichen Ebenen.

        Ja und?

        _Beispiele_ sind dazu da, dir das _Prinzip_ begreiflich zu machen.

        Also, hast du das Prinzip verstanden?

        ( ) Nein -> gehe nicht über Start, sondern zurück ins Manual, und lese nochmals nach

        ( ) Ja -> dann schreibe dir eine Vergleichsfunktion, die zwei deiner "member"-Arrays übergeben bekommt, und anhand von deren (Unter-)Eigenschaften entscheidet, welches als "vor" bzw. "nach" dem anderen einzusortieren betrachtet werden soll, und einen entsprechenden Rückgabewert liefert.

        gruß,
        wahsaga

        --
        /voodoo.css:
        #GeorgeWBush { position:absolute; bottom:-6ft; }
        1. Hallo,

          (X) Nein -> gehe nicht über Start, sondern zurück ins Manual, und lese nochmals nach

          Habe ich getan und dennoch sehe ich keinen Hinwei auf die unterschiedlichen Ebenen!

          bydey

          --
          -- bydey ist die Signatur und Verabschiedung, nicht der Nick --
          -- Navigate all your PHP web projects with  PHP Project Browser--
      2. echo $begrüßung;

        usort + kleine selbsterstellte Vergleichsfunktion.
        Ähnliche Beispiele habe ich schon bei multisort gefunden.
        Aber keines hat ein so tief verschachteltes Array (max. 2 Ebenen) und keines Schlüssel in 2 unterschiedlichen Ebenen.

        Welchen Teil des Ausgangsarrays möchtest du denn sortieren? Das gesamte Array oder das Teilarray member? Ich gehe mal von member aus, aber auch da gibt es ein kleines Problem, weil das Element _num nicht so richtig reinpasst. Da dieses Element keine gesteigerte Bedeutung hat - die Anzahl bekommt man durch Zählen raus - ist es sicher sinnvoll, dieses zuerst zu entfernen.
        usort() ruft deine Vergleichsfunktion mit zwei ELementen des members-Arrays auf. Du möchtest zuerst $a['_attributes']['depth'] mit $b['_attributes']['depth'] vergleichen. Und wenn beide Werte gleich sind möchtest du stattdessen das Ergebnis des Vergleichs $a['name'] und $b['name'] zurückgeben.
        Um ein Vergleichsergebnis zu erhalten, kann bei Zahlenwerten der $b-Wert vom $a-Wert subtrahiert werden. Für Stringvergleiche bietet sich strcmp() an.

        echo "$verabschiedung $name";

        1. Hallo,

          Welchen Teil des Ausgangsarrays möchtest du denn sortieren? Das gesamte Array oder das Teilarray member? Ich gehe mal von member aus, aber auch da gibt es ein kleines Problem, weil das Element _num nicht so richtig reinpasst. Da dieses Element keine gesteigerte Bedeutung hat - die Anzahl bekommt man durch Zählen raus - ist es sicher sinnvoll, dieses zuerst zu entfernen.
          usort() ruft deine Vergleichsfunktion mit zwei ELementen des members-Arrays auf. Du möchtest zuerst $a['_attributes']['depth'] mit $b['_attributes']['depth'] vergleichen. Und wenn beide Werte gleich sind möchtest du stattdessen das Ergebnis des Vergleichs $a['name'] und $b['name'] zurückgeben.
          Um ein Vergleichsergebnis zu erhalten, kann bei Zahlenwerten der $b-Wert vom $a-Wert subtrahiert werden. Für Stringvergleiche bietet sich strcmp() an.

          Danke!
          Schade, dass du das jetzt postest. Grad hab ichs selbst hinbekommen. Das glaubt mir ja jetzt keiner!

          Also, hast du das Prinzip verstanden?

          ( ) Nein -> gehe nicht über Start, sondern zurück ins Manual, und lese nochmals nach

          ( ) Ja ->

            
              uasort($xml_array['memberlist']['member'],'sort_array') ;  
           echo "<pre>";print_r ($xml_array);echo "</pre>";}//control  
          }  
            
          function sort_array($row1,$row2){  
             $first = strcmp($row1['_attributes']['dept'], $row2['_attributes']['dept']) ;  
             if ( $first )  
                 return $first ;  
             else  
                 return strcmp($row1['name'], $row2['name']) ;  
          }  
          
          

          Oder doch!? ;oP

          Noch mal danke für die Hilfe zur Selbsthilfe vielleicht sollte man einen FeatureArtikel draus machen.

          bydey

          --
          -- bydey ist die Signatur und Verabschiedung, nicht der Nick --
          -- Navigate all your PHP web projects with  PHP Project Browser--