Angesichts dieses Arrays:
$inventory = array(
array("type"=>"fruit", "price"=>3.50),
array("type"=>"milk", "price"=>2.90),
array("type"=>"pork", "price"=>5.43),
);
Ich möchte die $inventory
Elemente nach Preis sortieren , um Folgendes zu erhalten:
$inventory = array(
array("type"=>"pork", "price"=>5.43),
array("type"=>"fruit", "price"=>3.50),
array("type"=>"milk", "price"=>2.90),
);
Wie kann ich das machen?
Antworten:
Sie haben Recht, die Funktion, die Sie suchen, ist
array_multisort()
.Hier ist ein Beispiel, das direkt aus dem Handbuch stammt und an Ihren Fall angepasst ist:
quelle
PHP 7+
Ab PHP 7 kann dies
usort
mit einer anonymen Funktion , die den Raumschiffoperator verwendet, präzise erfolgen zum Vergleichen von Elementen , präzise erfolgen.Sie können eine aufsteigende Sortierung wie folgt durchführen:
Oder eine absteigende Sorte wie diese:
Um zu verstehen, wie dies funktioniert, beachten Sie, dass
usort
eine vom Benutzer bereitgestellte Vergleichsfunktion verwendet wird, die sich wie folgt verhalten muss (aus den Dokumenten):Und beachten Sie auch, dass
<=>
der Raumschiffbetreiber,Welches ist genau das, was
usort
braucht. Tatsächlich ist fast die gesamte Begründung für das Hinzufügen<=>
zur Sprache in https://wiki.php.net/rfc/combined-comparison-operator, dass dies der Fall istPHP 5.3+
PHP 5.3 führte anonyme Funktionen ein, verfügt jedoch noch nicht über den Raumschiffoperator. Wir können
usort
unser Array immer noch sortieren, aber es ist etwas ausführlicher und schwerer zu verstehen:Beachten Sie, dass , obwohl es für Komparatoren ziemlich häufig ist mit ganzzahligen Werten zu tun nur die Differenz der Werte zurück, wie
$item2['price'] - $item1['price']
wir können nicht sicher tun , dass in diesem Fall. Dies liegt daran, dass die Preise im Beispiel des Fragestellers Gleitkommazahlen sind, aber die Vergleichsfunktion, an die wir übergeben,usort
muss Ganzzahlen zurückgeben, damitusort
sie ordnungsgemäß funktioniert:Dies ist eine wichtige Falle, die Sie bei der Verwendung
usort
in PHP 5.x berücksichtigen sollten ! Meine ursprüngliche Version dieser Antwort hat diesen Fehler gemacht, und dennoch habe ich zehn positive Stimmen für Tausende von Ansichten gesammelt, ohne dass jemand den schwerwiegenden Fehler bemerkt hat. Die Leichtigkeit, mit der Schwachköpfe wie ich Komparatorfunktionen vermasseln können, ist genau der Grund, warum der benutzerfreundlichere Raumschiffoperator der Sprache in PHP 7 hinzugefügt wurde.quelle
uasort
. Nach dem Betrachten der Dokumente ist diese Antwort in diesem Fall jedoch immer noch korrekt . Im Beispiel des OP hat das zu sortierende Array sequentielle numerische Indizes anstelle von Zeichenfolgenindizes,usort
was besser geeignet ist. Die Verwendunguasort
eines sequentiell indizierten Arrays führt zu einem sortierten Array, das nicht nach seinen numerischen Indizes geordnet ist, so dass das erste Element in einerforeach
Schleife nicht geordnet ist$your_array[0]
, was wahrscheinlich kein wünschenswertes Verhalten ist.Während andere die Verwendung von richtig vorgeschlagen
array_multisort()
haben, scheint aus irgendeinem Grund keine Antwort die Existenz von anzuerkennenarray_column()
, was die Lösung erheblich vereinfachen kann. Mein Vorschlag wäre also:quelle
Da Ihre Array-Elemente selbst Arrays mit String-Schlüsseln sind, ist es am besten, eine benutzerdefinierte Vergleichsfunktion zu definieren. Es ist ziemlich schnell und einfach zu machen. Versuche dies:
Produziert folgendes:
quelle
uasort( $inventory, function ($a, $b) { if ( $a==$b ) return 0; else return ($a > $b) ? -1 : 1; });
usort
scheint geeigneter zu sein alsuasort
zum Sortieren eines Arrays mit fortlaufenden Zifferntasten. Das Ende eines Arrays, in dem sich das erste Element im Index1
und das zweite Element im Index0
befindet, ist ein seltsames Verhalten und eine sichere Falle für Personen, die mit den Details der PHP-Arrays nicht vertraut sind.usort
gibt Ihnen die Ausgabe, die Sie intuitiv erwarten würden.Ich endete damit:
Rufen Sie einfach die Funktion auf und übergeben Sie das Array und den Namen des Felds des Arrays der zweiten Ebene. Mögen:
quelle
Sie können
usort
mit anonymer Funktion verwenden, zquelle
strnatcmp
, um Strings zu vergleichen, gut zu funktionieren scheint. Anscheinend beinhaltet die "natürliche Reihenfolge", die sie implementiert, das Sortieren numerischer Zeichenfolgen numerisch und nicht lexikalisch.Ausgänge:
quelle
Von Sortieren Sie ein Array von assoziativen Arrays nach dem Wert des angegebenen Schlüssels in PHP :
Mit uasort ( http://php.net/uasort ) können Sie ein Array nach Ihrer eigenen definierten Funktion sortieren. In Ihrem Fall ist das einfach:
quelle
cmp
Funktion hier ist falsch. Es soll "eine ganze Zahl kleiner, gleich oder größer als Null zurückgeben, wenn das erste Argument als kleiner, gleich oder größer als das zweite angesehen wird", aber stattdessentrue
oder zurückgebenfalse
. Es scheint bemerkenswerterweise dennoch zu funktionieren - vielleicht weil die aktuelle Implementierung vonusort
und friends die Fälle "kleiner als" und "gleich" identisch behandelt -, aber rechnen Sie nicht damit, dass es in zukünftigen PHP-Versionen weiter funktioniert. Wenn sie versuchen, Sortierungen stabil zu machen (dh sich nicht unnötig um gleiche Elemente zu bewegen), wird dies unterbrochen.usort
wäre besser geeignet alsuasort
hier, dauasort
bewahrt die Zuordnung zwischen Schlüsseln und Werten , die verwirrend und unerwartet , wenn sie mit einem sequentiellen numerischen Array deaing. Zum Beispiel sind die oben genannten Indizes$array
nach dem Aufrufuasort
2, 0 und 1 in dieser Reihenfolge. Wenn Sie dies nicht aus irgendeinem Grund wünschen, werden Sie wahrscheinlich komfortabler damitusort
umgehen können, wodurch das Array neu indiziert und neu angeordnet wird.Wurde an 100 000 Datensätzen getestet: Zeit in Sekunden (berechnet durch Funktionsmikrozeit). Nur für eindeutige Werte beim Sortieren von Schlüsselpositionen.
Funktionslösung von @Josh Davis: Zeitaufwand : 1.5768740177155
Minenlösung : Verbringen Sie Zeit : 0,094044923782349
Lösung:
quelle
Ich benutze
uasort
soquelle
Diese Funktion ist wiederverwendbar:
Es funktioniert gut auf String - Werte standardmäßig, aber Sie werden für eine zu sub den Rückruf haben Nummer Vergleichsfunktion , wenn alle Werte Zahlen sind.
quelle
usortarr
, rufen dann aberuasort
statt anusort
; vielleicht ein bisschen verwirrend. Letzteres ist - im Fall eines sequentiellen Arrays mit numerischen Indizes, wie das in der Frage gezeigte - wahrscheinlich das, was Sie tatsächlich wollen.Sie könnten versuchen, Ihre eigene Vergleichsfunktion zu definieren und dann usort zu verwenden .
quelle
Hier ist eine Methode, die ich vor langer Zeit gefunden und ein bisschen aufgeräumt habe. Dies funktioniert hervorragend und kann schnell geändert werden, um auch Objekte zu akzeptieren.
Um die Methode zum Sortieren von Objekten zu ändern, ändern Sie einfach die folgende Zeile:
$tempArray[] = strtolower( $value[ $sortByKey ] );
zu$tempArray[] = strtolower( $value->$sortByKey );
Um die Methode auszuführen, tun Sie einfach
sortArray($inventory,'price','ASC');
quelle
array_multisort
) oder meine (mitusort
) und scheint im Gegenzug keine Vorteile gegenüber ihnen zu bieten.quelle
Versuche dies:
quelle
Vollständige dynamische Funktion Ich bin hier zur assoziativen Array-Sortierung gesprungen und habe diese erstaunliche Funktion auf http://php.net/manual/en/function.sort.php gefunden . Diese Funktion ist sehr dynamisch und sortiert in aufsteigender und absteigender Reihenfolge mit dem angegebenen Schlüssel.
Einfache Funktion zum Sortieren eines Arrays nach einem bestimmten Schlüssel. Behält die Indexzuordnung bei
quelle
quelle
Versuche dies:
Referenz finden Sie hier: http://php.net/manual/en/function.asort.php
Hier finden Sie verschiedene Sortierflags: http://www.php.net/manual/en/function.sort.php
quelle