mehrdimensionales array sortieren
dey
- php
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
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";
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
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
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
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
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";
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