Benjamin Wilfing: array_multisort und asort

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

  1. 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

    1. 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