1328 Stimmen

Wie man ein mehrdimensionales Array nach Wert sortiert

Wie kann ich dieses Array nach dem Wert des Schlüssels "order" sortieren?

Auch wenn die Werte derzeit sequenziell sind, werden sie es nicht immer sein.

Array
(
    [0] => Array
        (
            [hashtag] => a7e87329b5eab8578f4f1098a152d6f4
            [title] => Blume
            [order] => 3
        )

    [1] => Array
        (
            [hashtag] => b24ce0cd392a5b0b8dedc66c25213594
            [title] => Frei
            [order] => 2
        )

    [2] => Array
        (
            [hashtag] => e7d31fc0602fb2ede144d18cdffd816b
            [title] => Bereit
            [order] => 1
        )
)

4voto

Guillermo Phillips Punkte 2056

Wie in der akzeptierten Antwort angegeben, können Sie Folgendes verwenden:

usort($myArray, function($a, $b) {
    return $a['order'] <=> $b['order'];
});

Wenn Sie nach mehr als einer Spalte sortieren müssen, würden Sie Folgendes tun:

usort($myArray, function($a, $b) {
    return [$a['column1'],$a['column2']] <=> [$b['column1'],$b['column2']];
});

Dies kann auf beliebig viele Spalten in Ihren Daten erweitert werden. Dies basiert darauf, dass Sie Arrays direkt in PHP vergleichen können. Im obigen Beispiel würde das Array zuerst nach column1 und dann nach column2 sortiert werden. Sie können jedoch die Spalten in beliebiger Reihenfolge sortieren, z.B.:

usort($myArray, function($a, $b) {
    return [$a['column2'],$a['column1']] <=> [$b['column2'],$b['column1']];
});

Wenn Sie eine Spalte aufsteigend und eine andere absteigend sortieren müssen, dann tauschen Sie die absteigende Spalte auf die andere Seite des Operators <=>:

usort($myArray, function($a, $b) {
    return [$a['column1'],$b['column2']] <=> [$b['column1'],$a['column2']];
});

3voto

Zahid Punkte 39

Wenn jemand nach einem Schlüssel sortieren muss, ist es am besten, das folgende zu verwenden:

usort($array, build_sorter('order'));

function build_sorter($key) {
   return function ($a, $b) use ($key) {
      return strnatcmp($a[$key], $b[$key]);
   };
}

1voto

jspit Punkte 5531

Diese Lösung gilt für usort() mit einer einfach zu merkenden Notation für mehrdimensionales Sortieren. Der Spaceship-Operator <=> wird verwendet, der ab PHP 7 verfügbar ist.

usort($in,function($a,$b){
  return $a['first']   <=> $b['first']  //erstens aufsteigend
      ?: $a['second']  <=> $b['second'] //zweitens aufsteigend
      ?: $b['third']   <=> $a['third']  //drittens absteigend (a b getauscht!)
      //usw
  ;
});

Beispiele:

$in = [
  ['firstname' => 'Anton', 'surname' => 'Gruber', 'birthdate' => '03.08.1967', 'rank' => 3],
  ['firstname' => 'Anna', 'surname' => 'Egger', 'birthdate' => '04.01.1960', 'rank' => 1],
  ['firstname' => 'Paul', 'surname' => 'Mueller', 'birthdate' => '15.10.1971', 'rank' => 2],
  ['firstname' => 'Marie', 'surname' => 'Schmidt ', 'birthdate' => '24.12.1963', 'rank' => 2],
  ['firstname' => 'Emma', 'surname' => 'Mueller', 'birthdate' => '23.11.1969', 'rank' => 2],
];

Erste Aufgabe: Sortieren nach Rang aufsteigend, Nachname aufsteigend

usort($in,function($a,$b){
  return $a['rank']      <=> $b['rank']     //erstens aufsteigend
      ?: $a['surname']   <=> $b['surname']  //zweitens aufsteigend
  ;
});

Zweite Aufgabe: Sortieren nach Rang absteigend, Nachname aufsteigend, Vorname aufsteigend

usort($in,function($a,$b){
  return $b['rank']      <=> $a['rank']       //erstens absteigend
      ?: $a['surname']   <=> $b['surname']    //zweitens aufsteigend
      ?: $a['firstname'] <=> $b['firstname']  //drittens aufsteigend
  ;
});

Dritte Aufgabe: Sortieren nach Rang absteigend, Geburtsdatum aufsteigend

Das Datum kann nicht in dieser Notation sortiert werden. Es wird mit strtotime konvertiert.

usort($in,function($a,$b){
  return $b['rank']      <=> $a['rank']       //erstens absteigend
      ?: strtotime($a['birthdate']) <=> strtotime($b['birthdate'])    //zweitens aufsteigend
  ;
});

1voto

TAHER El Mehdi Punkte 2517

Sie könnten usort und eine benutzerdefinierte Sortierfunktion mit einer Rückruffunktion verwenden:

usort($new, fn($a, $b) => $a['order'] - $b['order']);

TIPP: Sie könnten a > b oder a - b oder a <=> b für die Sortierung in aufsteigender Reihenfolge verwenden. Für eine absteigende Reihenfolge tauschen Sie einfach die Position von a und b aus.

0voto

DanimalReks Punkte 165

Ich fand das hilfreich:

    $columns = array_column($data, "order");
    array_multisort($columns, SORT_ASC, $data);

Nach Name aufsteigend sortieren

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X