Grundlegende eindimensionale Arrays
$array = array(3, 5, 2, 8);
Anwendbare Sortierfunktionen:
sort
rsort
asort
arsort
natsort
natcasesort
ksort
krsort
Der Unterschied zwischen diesen besteht lediglich darin, ob Schlüsselwertzuordnungen beibehalten werden (die " a
" Funktionen), ob sie von niedrig nach hoch oder umgekehrt sortieren (" r
"), ob sie Werte oder Schlüssel sortieren (" k
") und wie sie Werte vergleichen (" nat
" gegen normal). Eine Übersicht und Links zu weiteren Details finden Sie unter http://php.net/manual/en/array.sorting.php .
Mehrdimensionale Arrays, einschließlich Arrays von Objekten
$array = array(
array('foo' => 'bar', 'baz' => 42),
array('foo' => ..., 'baz' => ...),
...
);
Wenn Sie nach $array
dem Schlüssel 'foo' jedes Eintrags sortieren möchten , benötigen Sie eine benutzerdefinierte Vergleichsfunktion . Die obigen sort
und verwandten Funktionen arbeiten mit einfachen Werten, die sie vergleichen und sortieren können. PHP ist nicht einfach „wissen“ , was mit einem tun komplexen Wert wie array('foo' => 'bar', 'baz' => 42)
obwohl; Also musst du es sagen.
Dazu müssen Sie eine Vergleichsfunktion erstellen . Diese Funktion benötigt zwei Elemente und muss zurückgeben, 0
wenn diese Elemente als gleich angesehen werden, einen niedrigeren Wert als 0
den ersten Wert und einen höheren Wert als 0
den ersten Wert. Das ist alles was benötigt wird:
function cmp(array $a, array $b) {
if ($a['foo'] < $b['foo']) {
return -1;
} else if ($a['foo'] > $b['foo']) {
return 1;
} else {
return 0;
}
}
Oft möchten Sie eine anonyme Funktion als Rückruf verwenden. Wenn Sie eine Methode oder eine statische Methode verwenden möchten, sehen Sie sich die anderen Möglichkeiten zum Angeben eines Rückrufs in PHP an .
Sie verwenden dann eine der folgenden Funktionen:
Auch hier unterscheiden sie sich nur darin, ob sie Schlüssel-Wert-Zuordnungen beibehalten und nach Werten oder Schlüsseln sortieren. Lesen Sie die Dokumentation für Details.
Anwendungsbeispiel:
usort($array, 'cmp');
usort
nimmt zwei Elemente aus dem Array und ruft Ihre cmp
Funktion mit ihnen auf. So cmp()
wird mit $a
als array('foo' => 'bar', 'baz' => 42)
und $b
als einem anderen aufgerufen array('foo' => ..., 'baz' => ...)
. Die Funktion gibt dann zurück, usort
welcher der Werte größer war oder ob sie gleich waren. usort
wiederholt diesen Vorgang und übergibt verschiedene Werte für $a
und $b
bis das Array sortiert ist. Die cmp
Funktion wird viele Male aufgerufen, mindestens so oft, wie Werte vorhanden sind $array
, mit unterschiedlichen Wertekombinationen für $a
und $b
jedes Mal.
Versuchen Sie Folgendes, um sich an diese Idee zu gewöhnen:
function cmp($a, $b) {
echo 'cmp called with $a:', PHP_EOL;
var_dump($a);
echo 'and $b:', PHP_EOL;
var_dump($b);
}
Sie haben lediglich eine benutzerdefinierte Methode zum Vergleichen von zwei Elementen definiert. Das ist alles, was Sie benötigen. Das funktioniert mit allen möglichen Werten.
Das funktioniert übrigens bei jedem Wert, die Werte müssen keine komplexen Arrays sein. Wenn Sie einen benutzerdefinierten Vergleich durchführen möchten, können Sie diesen auch für eine einfache Reihe von Zahlen durchführen.
sort
sortiert nach Referenz und gibt nichts Nützliches zurück!
Beachten Sie, dass das Array an Ort und Stelle sortiert ist und Sie den Rückgabewert nichts zuweisen müssen. $array = sort($array)
ersetzt das Array durch true
, nicht durch ein sortiertes Array. Funktioniert einfach sort($array);
.
Benutzerdefinierte numerische Vergleiche
Wenn Sie nach baz
dem numerischen Schlüssel sortieren möchten, müssen Sie lediglich Folgendes tun:
function cmp(array $a, array $b) {
return $a['baz'] - $b['baz'];
}
Dank The PoWEr of MATH wird ein Wert <0, 0 oder> 0 zurückgegeben, je nachdem, ob er kleiner$a
, gleich oder größer als ist $b
.
Beachten Sie, dass dies für float
Werte nicht gut funktioniert , da sie auf a reduziert werden int
und an Genauigkeit verlieren. Verwenden Sie explizit -1
, 0
und das 1
Rück stattdessen Werte.
Objekte
Wenn Sie über ein Array von Objekten verfügen, funktioniert dies auf folgende Weise:
function cmp($a, $b) {
return $a->baz - $b->baz;
}
Funktionen
Innerhalb einer Vergleichsfunktion können Sie alles tun, was Sie brauchen, einschließlich der Aufruffunktionen:
function cmp(array $a, array $b) {
return someFunction($a['baz']) - someFunction($b['baz']);
}
Saiten
Eine Verknüpfung für die erste String-Vergleichsversion:
function cmp(array $a, array $b) {
return strcmp($a['foo'], $b['foo']);
}
strcmp
macht genau das, was von cmp
hier erwartet wird , es kehrt zurück -1
, 0
oder 1
.
Raumschiffbetreiber
PHP 7 führte den Raumschiffoperator ein , der gleich / kleiner / größer als Vergleiche zwischen Typen vereinheitlicht und vereinfacht:
function cmp(array $a, array $b) {
return $a['foo'] <=> $b['foo'];
}
Sortieren nach mehreren Feldern
Wenn Sie hauptsächlich nach sortieren möchten foo
, aber wenn foo
für zwei Elemente gleich ist, sortieren Sie nach baz
:
function cmp(array $a, array $b) {
if (($cmp = strcmp($a['foo'], $b['foo'])) !== 0) {
return $cmp;
} else {
return $a['baz'] - $b['baz'];
}
}
Für Vertraute entspricht dies einer SQL-Abfrage mit ORDER BY foo, baz
.
Sehen Sie sich auch diese sehr übersichtliche Kurzfassung an und erfahren Sie, wie Sie eine solche Vergleichsfunktion dynamisch für eine beliebige Anzahl von Schlüsseln erstellen .
Sortieren in eine manuelle, statische Reihenfolge
Wenn Sie Elemente in einer "manuellen Reihenfolge" wie "foo", "bar", "baz" sortieren möchten :
function cmp(array $a, array $b) {
static $order = array('foo', 'bar', 'baz');
return array_search($a['foo'], $order) - array_search($b['foo'], $order);
}
Wenn Sie in allen oben genannten Fällen PHP 5.3 oder höher verwenden (und dies wirklich tun sollten), verwenden Sie anonyme Funktionen für kürzeren Code und um zu vermeiden, dass eine andere globale Funktion im Umlauf ist:
usort($array, function (array $a, array $b) { return $a['baz'] - $b['baz']; });
So einfach kann das Sortieren eines komplexen mehrdimensionalen Arrays sein. Denken Sie noch einmal daran, PHP beizubringen, wie man erkennt, welches der beiden Elemente "größer" ist . Lassen Sie PHP die eigentliche Sortierung durchführen.
Um zwischen aufsteigender und absteigender Reihenfolge zu wechseln, tauschen Sie einfach die Argumente $a
und $b
um. Z.B:
return $a['baz'] - $b['baz']; // ascending
return $b['baz'] - $a['baz']; // descending
Sortieren eines Arrays nach einem anderen
Und dann gibt es noch die Besonderheit array_multisort
, mit der Sie ein Array nach einem anderen sortieren können:
$array1 = array( 4, 6, 1);
$array2 = array('a', 'b', 'c');
Das erwartete Ergebnis wäre hier:
$array2 = array('c', 'a', 'b'); // the sorted order of $array1
Verwenden Sie array_multisort
, um dorthin zu gelangen:
array_multisort($array1, $array2);
Ab PHP 5.5.0 können Sie array_column
eine Spalte aus einem mehrdimensionalen Array extrahieren und das Array nach dieser Spalte sortieren:
array_multisort(array_column($array, 'foo'), SORT_DESC, $array);
Ab PHP 7.0.0 können Sie auch Eigenschaften aus einem Array von Objekten extrahieren.
Wenn Sie häufigere Fälle haben, können Sie diese Antwort jederzeit bearbeiten.