Bauer: nach 2.-Arrayfeld sortieren

Moin,

habe folgendes Array:

$test= array(array("ziegen",7),array("schweine",38),array("elefanten",12));

mit sort($test) kann ich das ganze wunderbar nach der 1.Zelle also dem Namen sortieren.

Ich würde es aber gerne nach den Werten sortieren.

Mit rsort bzw. arsort klappt das nicht.

Wie ist es richtig?

thx

  1. Ich würde es aber gerne nach den Werten sortieren.

    array_multisort()

    Den üblichen Kommentar, dass Sven kommen wird, spare ich mir an dieser Stelle :)

    1. Sorry, aber ich schnalls immer noch nicht.

      Wenn ich mir die diversen Beispiele anschaue, kann ich mit multisort nur arrays innerhalb eines arrays sortieren.

      Das will ich aber ja garnicht.

      Mein Ziel ist es sämmtliche array innerhalb das Hauptarray nach der 2.Zelle des Hauptarrays zu sortieren:

      $test= array(array("ziegen",7),array("schweine",38),array("elefanten",12));

      Das ergebnis soll also sein:
      $test[0][0]="schweine"
      $test[0][1]="38"

      $test[1][0]="elefanten"
      $test[1][1]="12"

      $test[2][0]="ziegen"
      $test[2][1]="7"

      Das bekomme ich mit multisort irgendwie auch nicht hin.

      Gruß

      1. Wenn ich mir die diversen Beispiele anschaue, kann ich mit multisort nur arrays innerhalb eines arrays sortieren.

        Ja, das nennt sich gemeinhin mehrdimensionales Array ...

        Das will ich aber ja garnicht.

        ... und genau ein solches hast du.

        Mein Ziel ist es sämmtliche array innerhalb das Hauptarray nach der 2.Zelle des Hauptarrays zu sortieren:

        Ich fasse das nochmal zusammen:

        multisort [kann] nur arrays innerhalb eines arrays sortieren.
        Mein Ziel ist [...] array[s] innerhalb [des] Hauptarray[s] [...] zu sortieren [...]

        Das bekomme ich mit multisort irgendwie auch nicht hin.

        Beispiel 3 in der Dokumentation.

        1. Moin!

          multisort [kann] nur arrays innerhalb eines arrays sortieren.
          Mein Ziel ist [...] array[s] innerhalb [des] Hauptarray[s] [...] zu sortieren [...]

          Das bekomme ich mit multisort irgendwie auch nicht hin.

          Beispiel 3 in der Dokumentation.

          Ganz schlechtes Beispiel.

          array_multisort() ist geeignet für den Fall, dass man zwei oder mehr Arrays hat, in denen jeweils unter dem gleichen Key unterschiedliche Inhalte stehen, und man nun gern möchte, dass das eine Array sortiert wird und sich alle Werte in den anderen Arrays parallel dazu ebenfalls mitbewegen, so dass die Zuordnung insgesamt erhalten bleibt.

          Zu kritisieren ist, dass man in solch einem Fall im Prinzip gar kein array_multisort() benötigt, denn es würde ja vollkommen ausreichen, nur das eine Array so zu sortieren, dass die Key-Zuordnung erhalten bleibt (vor allem relevant bei numerischen Keys, die werden gerne mal neu generiert, bei Null startend) - asort() wäre hierfür die richtige Funktion.

          Als Bonus für die Vermeidung von array_multisort() und stattdessen dem Einsatz von asort() erhält man in diesem Szenario die Möglichkeit, mehr als eine Sortierung gleichzeitig nutzen zu können, weil alle voneinander unabhängigen Array-Variablen ja isoliert sortiert werden können, und nur die Erhaltung der Key-Zuordnung zu den Werten dafür sorgt, dass man, wenn man einen Key aus dem einen Array kennt, auch auf alle Werte in den anderen Arrays zugreifen kann.

          Beispiel:

          $tiere = array('Esel', 'Hahn', 'Katze', 'Hund');
          $gewicht = array(100, 2, 5, 15);
          // Esel => 100 kg, etc...

          asort($tiere); // Nach Tiernamen sortieren
          asort($gewicht); // Nach Gewicht sortieren

          echo "Tiere nach Alphabet:\n";
          foreach ($tiere as $key => $name) {
            echo "Der $name wiegt {$gewicht[$key]} Kilo\n";
          }

          echo "Tiere nach Gewicht:\n";
          foreach ($gewicht as $key => $kilo) {
            echo "Der {$tiere[$key]} wiegt $kilo Kilo\n";
          }

          Da man diese - gern auch in einem einzigen Array zusammengefaßte, also $musikanten['tiere'] und $musikanten['gewicht'] - Konstellation aber nicht wirklich häufig antrifft, sondern viel eher innerhalb eines einzelnen Array-Eintrags alle Detail-Angaben findet, so wie es bei Datenbank-Abfragen üblich ist, ist dein Verweis auf array_multisort()-Anwendungsbeispiel 3 zwar in der Sache korrekt, er ignoriert aber, dass dieses Anwendungsbeispiel, um überhaupt array_multisort() nutzen zu können, das Array erst komplett umbauen muss, damit array_multisort() überhaupt funktionieren kann. Alternativ dazu kann man sich ja auch eine Callback-Vergleichs-Funktion schreiben und mit usort() arbeiten.

          Es gibt also im Prinzip keinen Grund für die Existenz von array_multisort(), sie ist rein technisch gesehen überflüssig.

          - Sven Rautenberg

    2. Moin!

      Ich würde es aber gerne nach den Werten sortieren.

      array_multisort()

      Den üblichen Kommentar, dass Sven kommen wird, spare ich mir an dieser Stelle :)

      Der kommt auch ohne Kommentar.

      - Sven Rautenberg

    3. Hello,

      Den üblichen Kommentar, dass Sven kommen wird, spare ich mir an dieser Stelle :)

      Sonst hätte ich den Part übernommen:
      http://forum.de.selfhtml.org/archiv/2009/9/t191001/#m1277194
      http://forum.de.selfhtml.org/archiv/2009/5/t187244/#m1244374

      Liebe Grüße aus dem schönen Oberharz

      Tom vom Berg

      --
       ☻_
      /▌
      / \ Nur selber lernen macht schlau
      http://bergpost.annerschbarrich.de
  2. Hi,

    Wie ist es richtig?

    Mit usort und selbstgeschriebener Vergleichsfunktion.

    MfG ChrisB

    --
    RGB is totally confusing - I mean, at least #C0FFEE should be brown, right?