array_multisort und asort
Benjamin Wilfing
- php
Hallo,
mit asort($array) kann man einen assoziativen Array unter Beibehaltung der Zuordnungen sortieren - soweit ist alles klar. Nun bin ich auf die Funktion array_multisort (http://www.php.net/manual/de/function.array-multisort.php) gestoßen, und habe das Manual dort nicht so richtig verstanden. Ich versuche das Problem mal grafisch darzustellen:
Hier ein assoziativer Array:
$fruits = array ("d"=>"Zitrone", "a"=>"Orange", "b"=>"Banane", "c"=>"Apfel");
Auf diesen Array asort angewendet, hat er nachher folgende Reihenfolge:
c = Apfel
b = Banane
a = Orange
d = Zitrone
(bis hierher aus dem PHP-Handbuch kopiert)
Hier nun zwei nicht-assoziativen Arrays:
+-----------+----------+
| Array 1 | Array 2 |
| (Indizes) | (Werte) |
+-----------+----------+
| d | Zitrone |
| a | Orange |
| b | Banane |
| c | Apfel |
+-----------+----------+
Ich betrachte die Elemente des Array 1 als Indizes, und die des Array 2 als den Inhalt. Kann ich mit array_multisort so den gleichen Effekt wie mit asort aus dem ersten Beispiel erzielen, nur eben auf 2 nicht-assotziative Arrays verteilt, so dass es am Ende folgendermaßen aussieht?:
+-----------+----------+
| Array 1 | Array 2 |
| (Indizes) | (Werte) |
+-----------+----------+
| c | Apfel |
| b | Banane |
| a | Orange |
| d | Zitrone |
+-----------+----------+
Oder muss ich mir dafür was eigenes basteln?
Danke für eure Hilfe.
Grüße aus Darmstadt,
Benjamin
Hallo Benjamin,
mit asort($array) kann man einen assoziativen Array unter Beibehaltung der Zuordnungen sortieren - soweit ist alles klar. Nun bin ich auf die Funktion array_multisort (http://www.php.net/manual/de/function.array-multisort.php) gestoßen, und habe das Manual dort nicht so richtig verstanden.
Der Vergleich mit ORDER BY in SQL ist recht anschaulich, finde ich: »[...] Bei der Sortierung werden die Schlüsselassoziationen beibehalten. Die angegebenen Arrays werden als Spalten einer Tabelle behandelt, welche nach Reihen sortiert werden«.
Ich betrachte die Elemente des Array 1 als Indizes, und die des Array 2 als den Inhalt. Kann ich mit array_multisort so den gleichen Effekt wie mit asort aus dem ersten Beispiel erzielen, nur eben auf 2 nicht-assotziative Arrays verteilt
Probiere es einfach aus. ;) Anscheinend ja, siehe folgendes Beispiel:
<?php
$keys=Array('d', 'a', 'b', 'c');
$values=Array('Zitrone', 'Orange', 'Banane', 'Apfel');
array_multisort($values, $keys);
/* Zusammenkleben: */
$murks=Array();
foreach ($keys as $key) list(, $murks[$key])=each($values);
print_r($murks);
?>
Gibt aus:
Array
(
[c] => Apfel
[b] => Banane
[a] => Orange
[d] => Zitrone
)
Das ähnelt der von dir gewünschten Sortierung nicht wenig:
| c | Apfel |
| b | Banane |
| a | Orange |
| d | Zitrone |Oder muss ich mir dafür was eigenes basteln?
Wie ich die Doku verstehe und wie die Tests zeigen offensichtlich nicht, array_multisort ist vermutlich genau das, was du suchst.
Grüße,
Mathias
Hallo Mathias,
<?php
$keys=Array('d', 'a', 'b', 'c');
$values=Array('Zitrone', 'Orange', 'Banane', 'Apfel');array_multisort($values, $keys);
[...]
Wie ich die Doku verstehe und wie die Tests zeigen offensichtlich nicht, array_multisort ist vermutlich genau das, was du suchst.
Absolut perfekt, vielen Dank! Und tatsächlich kann man für jeden einzelnen Array, der als Parameter angegeben ist, die Sortierung beeinflussen (numerisch/String/normal, und auf-/absteigend):
array_multisort($values, SORT_STRING, SORT_DESC, $keys, SORT_NUMERIC, SORT_ASC)
Die Sortierungseinstellungen werden dann nacheinander auf die Arrays angewandt (oder angewendet, was ist eigentlich richtiger?). Super!
Hocherfreute Grüße aus Darmstadt,
Benjamin