Diese Frage ist als Referenz für Fragen zum Sortieren von Arrays in PHP gedacht. Es ist leicht zu glauben, dass Ihr spezieller Fall einzigartig ist und eine neue Frage verdient, aber die meisten sind tatsächlich geringfügige Variationen einer der Lösungen auf dieser Seite.
Wenn Ihre Frage als Duplikat dieser Frage geschlossen ist, bitten Sie darum, dass Ihre Frage nur dann wieder geöffnet wird, wenn Sie erklären können, warum sie sich deutlich von allen folgenden unterscheidet.
Wie sortiere ich ein Array in PHP?
Wie sortiere ich ein komplexes Array in PHP?
Wie sortiere ich ein Array von Objekten in PHP?
Für die praktische Antwort unter Verwendung der vorhandenen Funktionen von PHP siehe 1., für die akademische ausführliche Antwort zu Sortieralgorithmen (welche Funktionen von PHP implementiert sind und welche Sie möglicherweise für wirklich, wirklich komplexe Fälle benötigen), siehe 2.
Antworten:
Grundlegende eindimensionale Arrays
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
Wenn Sie nach
$array
dem Schlüssel 'foo' jedes Eintrags sortieren möchten , benötigen Sie eine benutzerdefinierte Vergleichsfunktion . Die obigensort
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 wiearray('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 als0
den ersten Wert und einen höheren Wert als0
den ersten Wert. Das ist alles was benötigt wird: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:
usort
uasort
uksort
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
nimmt zwei Elemente aus dem Array und ruft Ihrecmp
Funktion mit ihnen auf. Socmp()
wird mit$a
alsarray('foo' => 'bar', 'baz' => 42)
und$b
als einem anderen aufgerufenarray('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. Diecmp
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:
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 durchtrue
, nicht durch ein sortiertes Array. Funktioniert einfachsort($array);
.Benutzerdefinierte numerische Vergleiche
Wenn Sie nach
baz
dem numerischen Schlüssel sortieren möchten, müssen Sie lediglich Folgendes tun: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 werdenint
und an Genauigkeit verlieren. Verwenden Sie explizit-1
,0
und das1
Rück stattdessen Werte.Objekte
Wenn Sie über ein Array von Objekten verfügen, funktioniert dies auf folgende Weise:
Funktionen
Innerhalb einer Vergleichsfunktion können Sie alles tun, was Sie brauchen, einschließlich der Aufruffunktionen:
Saiten
Eine Verknüpfung für die erste String-Vergleichsversion:
strcmp
macht genau das, was voncmp
hier erwartet wird , es kehrt zurück-1
,0
oder1
.Raumschiffbetreiber
PHP 7 führte den Raumschiffoperator ein , der gleich / kleiner / größer als Vergleiche zwischen Typen vereinheitlicht und vereinfacht:
Sortieren nach mehreren Feldern
Wenn Sie hauptsächlich nach sortieren möchten
foo
, aber wennfoo
für zwei Elemente gleich ist, sortieren Sie nachbaz
: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 :
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:
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: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:Das erwartete Ergebnis wäre hier:
Verwenden Sie
array_multisort
, um dorthin zu gelangen:Ab PHP 5.5.0 können Sie
array_column
eine Spalte aus einem mehrdimensionalen Array extrahieren und das Array nach dieser Spalte sortieren:Ab PHP 7.0.0 können Sie auch Eigenschaften aus einem Array von Objekten extrahieren.
quelle
array_flip()
schnellere Positionssuche verwenden, z . B.$order[$a['foo']]
anstelle vonarray_search($a['foo'], $order)
.Nun, die meisten grundlegenden Methoden sind bereits durch Täuschung abgedeckt. Ich würde versuchen, andere Arten von Sorten zu betrachten
Sortieren mit SPL
SplHeap
Ausgabe
SplMaxHeap
Die SplMaxHeap-Klasse bietet die Hauptfunktionen eines Heaps und hält das Maximum oben.
SplMinHeap
Andere Arten der Sortierung
Blasensortierung
Aus dem Wikipedia-Artikel über Bubble Sort:
Auswahl sortieren
Aus dem Wikipedia-Artikel über Auswahl sortieren:
Sortieren durch Einfügen
Aus dem Wikipedia-Artikel über Einfügungssortierung:
Shellsort
Aus dem Wikipedia-Artikel über Shellsort:
Kammsortierung
Aus dem Wikipedia-Artikel über Kammsortierung:
Zusammenführen, sortieren
Aus dem Wikipedia-Artikel über Zusammenführen sortieren:
Schnelle Sorte
Aus dem Wikipedia-Artikel über Quicksort:
Permutationssortierung
Aus dem Wikipedia-Artikel über Permutation sort:
Radix sort
Aus dem Wikipedia-Artikel über Radix sort:
quelle
O(n^2)
Vergleichen führt, wenn nur das erste Element als Drehpunkt verwendet wird)Stabile Sorte
Angenommen, Sie haben ein Array wie dieses:
Und jetzt möchten Sie nur nach dem ersten Buchstaben sortieren:
Das Ergebnis ist folgendes:
Die Sorte war nicht stabil!
Der aufmerksame Beobachter hat möglicherweise bemerkt, dass der Array-Sortieralgorithmus (QuickSort) kein stabiles Ergebnis liefert und dass die ursprüngliche Reihenfolge zwischen Wörtern desselben Anfangsbuchstabens nicht beibehalten wurde. Dieser Fall ist trivial und wir hätten die gesamte Zeichenfolge vergleichen sollen, aber nehmen wir an, dass Ihr Anwendungsfall komplizierter ist, z. B. zwei aufeinanderfolgende Sortierungen in verschiedenen Feldern, die die Arbeit des anderen nicht aufheben sollten.
Die Schwartzsche Transformation
Die Schwartzsche Transformation , auch als Dekorations-Sortier-Undekorations-Redewendung bezeichnet, bewirkt eine stabile Sortierung mit einem inhärent instabilen Sortieralgorithmus.
Zunächst dekorieren Sie jedes Array-Element mit einem anderen Array, das einen Primärschlüssel (den Wert) und einen Sekundärschlüssel (seinen Index oder seine Position) umfasst:
Dies transformiert das Array in Folgendes:
Jetzt passen wir den Vergleichsschritt an; Wir vergleichen den ersten Buchstaben erneut, aber wenn sie gleich sind, wird der Sekundärschlüssel verwendet, um die ursprüngliche Reihenfolge beizubehalten:
Danach dekorieren wir:
Das Endergebnis:
Was ist mit Wiederverwendung?
Sie mussten Ihre Vergleichsfunktion neu schreiben, um mit den transformierten Array-Elementen arbeiten zu können. Möglicherweise möchten Sie Ihre heiklen Vergleichsfunktionen nicht bearbeiten. Hier ist ein Wrapper für die Vergleichsfunktion:
Schreiben wir den Sortierschritt mit dieser Funktion:
Voila! Ihr makelloser Vergleichscode ist zurück.
quelle
Ab PHP 5.3 mit Closures ist es auch möglich, einen Closure zu verwenden, um die Reihenfolge Ihrer Sortierung zu bestimmen.
Angenommen, $ array ist ein Array von Objekten, die eine month-Eigenschaft enthalten.
quelle
LINQ
In .NET wird LINQ häufig zum Sortieren verwendet, was eine viel bessere Syntax gegenüber Vergleichsfunktionen bietet, insbesondere wenn Objekte nach mehreren Feldern sortiert werden müssen. Es gibt mehrere Ports von LINQ zu PHP, einschließlich der YaLinqo- Bibliothek *. Damit können Arrays mit einer einzigen Zeile sortiert werden, ohne komplexe Vergleichsfunktionen zu schreiben.
Vergleiche können weiter angepasst werden, indem ein Rückruf als zweites Argument übergeben wird, zum Beispiel:
Hier
'$v->count'
ist eine Abkürzung fürfunction ($v) { return $v->count; }
(entweder kann verwendet werden). Diese Methodenketten geben Iteratoren zurück. Iteratoren können bei Bedarf durch Hinzufügen->toArray()
am Ende in Arrays umgewandelt werden .Intern
orderBy
und verwandte Methoden aufrufen entsprechenden Array Sortierfunktionen (uasort
,krsort
,multisort
,usort
etc.).LINQ enthält viele weitere Methoden, die von SQL inspiriert sind: Filtern, Gruppieren, Verbinden, Aggregieren usw. Es eignet sich am besten für Fälle, in denen komplexe Transformationen für Arrays und Objekte durchgeführt werden müssen, ohne auf Datenbanken angewiesen zu sein.
* Von mir entwickelt, siehe Readme für weitere Details und Vergleich mit anderen LINQ-Ports
quelle
Mehrdimensionale Sortierung nach Schlüsselwert
Natürliche Art eines mehrdimensionalen Arrays durch einen Schlüsselwert und behalten Sie auch die ursprüngliche Reihenfolge bei (mischen Sie nicht die Hauptschlüssel):
Testfall:
quelle
Es ist sehr praktisch, Arrays mit sortierter Funktion von Nspl aus zu sortieren :
Grundlegende Sortierung
Sortieren nach Funktionsergebnis
Mehrdimensionales Array sortieren
Array von Objekten sortieren
Sortieren mit einer Vergleichsfunktion
Sie können alle diese Beispiele hier sehen .
quelle
Wenn Sie nach dem Schlüsselwert bestellen möchten, können Sie dies in einer Zeile tun, elegant und klar. Dies wird nach dem Preis aufsteigend bestellt. Verwendet array_multisort und array_column.
produzieren
quelle
Diese Seite ist sehr umfangreich, aber ich möchte noch etwas mehr über den großartigen Nutzen des Raumschiff-Operators (Drei-Wege-Vergleichsoperator) hinzufügen - eines schönen Kindes von PHP7 +.
Verwenden des Raumschiffoperators zum Implementieren mehrerer Sortierbedingungen
Dies macht große Fortschritte bei der Reduzierung des Aufblähens von Code und der Verbesserung der Lesbarkeit.
Wenn Sie Ihre benutzerdefinierte Sortierfunktion (
usort()
/uasort()
/uksort()
) schreiben, um mehrere Bedingungen zu verarbeiten, müssen Sie nur ausgeglichene Arrays auf beiden Seiten des Operators schreiben und das Ergebnis zurückgeben. Keine verschachtelten Bedingungsblöcke oder Mehrfachrückgaben mehr.Die Elemente von beiden Seiten des Bedieners werden nacheinander von links nach rechts durchlaufen und die Auswertung zurückgegeben, sobald eine Nichtbindung festgestellt wird oder wenn alle Elemente verglichen wurden.
Beispieldaten für meine Demonstrationen:
Demonstrationen (um ein Aufblähen der Stackoverflow-Seite zu vermeiden, lesen Sie bitte den Demo-Link für die Ausgaben):
Sortierlogik:
float ASC
Sortierlogik:
Boolescher ASC
Sortierlogik:
natString ASC
Mit dieser Syntax können Sie Werte, funktionale Ergebnisse, tief verschachtelte Daten und Sortierrichtungen auf elegante Weise sortieren. Es lohnt sich auf jeden Fall, in Ihr PHP-Toolbelt einzusteigen ... für Fälle, in denen Sie Daten außerhalb der Datenbank verarbeiten - natürlich wäre SQL eine viel sinnvollere Technik.
Ab PHP7.4 können Sie nach eigenem Ermessen die Pfeilsyntax mit diesen anonymen Funktionen verwenden. Gleiches Skript mit Pfeilsyntax .
quelle
Wenn jemand eine einfachere Lösung für die Bearbeitung von Arrays wünscht, verwenden Sie einfach das Laravel Collection-Paket mit einer implementierten sortBy-Funktion, mit der Sie einfach nach Schlüsseln sortieren können.
dh, um zuerst nach a, dann nach b und dann nach c zu sortieren, wäre die richtige Klausel
https://packagist.org/packages/tightenco/collect
quelle
Es gibt verschiedene Möglichkeiten, ein Array zu sortieren. Ich werde einige Methoden für diese Aufgabe erwähnen. Zunächst einmal werde ich ein ganzzahliges Array angeben, das als '$ numbers' bezeichnet wird.
Dies ist der normale Weg zum Erstellen eines Arrays. Angenommen, ich möchte dieses Array in aufsteigender Reihenfolge sortieren. Dafür kann die Methode 'sort ()' verwendet werden.
Betrachten Sie nun die Ausgabe davon,
Sie können sehen, dass das gedruckte Nummernfeld sortiert ist. Wenn das Nummernarray in absteigender Reihenfolge sortiert werden soll, kann für diese Aufgabe die Methode 'rsort ()' verwendet werden.
Betrachten Sie die Ausgabe ..
Jetzt wird das Array in absteigender Reihenfolge sortiert. Okay, betrachten wir ein assoziatives Array. Ich gebe ein assoziatives Array (assoziatives Array bedeutet, dass ein Array, dessen jeder Index einen eindeutigen Schlüsselwert hat) wie folgt:
Nun möchte ich dieses Array in aufsteigender Reihenfolge nach ihrem Wert sortieren. Dafür kann die Methode 'asort ()' verwendet werden.
Wenn Sie die absteigende Reihenfolge nach ihrem Wert sortieren, kann die Methode 'arsort ()' verwendet werden. Angenommen, Sie möchten dieses Array nach seinem Schlüsselwert sortieren. In diesem Fall kann die Methode 'ksort ()' verwendet werden.
Betrachten Sie nun die Ausgabe.
Jetzt wird das Array nach seinem Schlüsselwert sortiert. Wenn Sie das Array in absteigender Reihenfolge nach ihrem Schlüsselwert sortieren möchten, kann die Methode 'krsort ()' verwendet werden.
Jetzt wird das assoziative Array in absteigender Reihenfolge nach seinem Schlüsselwert sortiert. Sehen Sie sich die Ausgabe an.
Dies sind einige Methoden zum Sortieren eines Arrays in aufsteigender oder absteigender Reihenfolge in PHP. Ich hoffe, Sie könnten eine Idee bekommen. Danke!
quelle
Am einfachsten ist es, die Funktion usort zu verwenden, um das Array ohne Schleifen zu sortieren: Nachfolgend finden Sie ein Beispiel:
Dies wird in absteigender Reihenfolge sortiert:
Dies wird in aufsteigender Reihenfolge sortiert:
quelle