PHP 7+
Ab PHP 7 kann dies kurz und bündig mit usort
mit einer anonyme Funktion die den Raumschiffbetreiber um Elemente zu vergleichen.
Sie können eine aufsteigende Sortierung wie folgt vornehmen:
usort($inventory, function ($item1, $item2) {
return $item1['price'] <=> $item2['price'];
});
Oder eine absteigende Art wie diese:
usort($inventory, function ($item1, $item2) {
return $item2['price'] <=> $item1['price'];
});
Um zu verstehen, wie das funktioniert, muss man wissen, dass usort
nimmt eine vom Benutzer bereitgestellte Vergleichsfunktion, die sich wie folgt verhalten muss (aus den Dokumenten):
Die Vergleichsfunktion muss eine ganze Zahl zurückgeben, die kleiner, gleich oder größer als Null ist, wenn das erste Argument als kleiner, gleich oder größer als das zweite betrachtet wird.
Und beachten Sie auch, dass <=>
der Raumschiffbetreiber,
gibt 0 zurück, wenn beide Operanden gleich sind, 1, wenn der linke größer ist, und -1, wenn der rechte größer ist
was genau das ist, was usort
Bedürfnisse. In der Tat ist fast die gesamte Begründung für die Aufnahme von <=>
zur Sprache in https://wiki.php.net/rfc/combined-comparison-operator ist, dass es
macht das Schreiben von Bestellrückrufen für die Verwendung mit usort()
einfacher
PHP 5.3+
Mit PHP 5.3 wurden anonyme Funktionen eingeführt, aber es gibt noch nicht den Raumschiff-Operator. Wir können immer noch usort
um unser Array zu sortieren, aber es ist etwas ausführlicher und schwieriger zu verstehen:
usort($inventory, function ($item1, $item2) {
if ($item1['price'] == $item2['price']) return 0;
return $item1['price'] < $item2['price'] ? -1 : 1;
});
Beachten Sie, dass es für Komparatoren, die mit Integer-Werten arbeiten, zwar üblich ist, nur die Differenz der Werte zurückzugeben, wie $item2['price'] - $item1['price']
wir kann nicht in diesem Fall sicher tun. Das liegt daran, dass die Preise im Beispiel des Fragestellers Fließkommazahlen sind, aber die Vergleichsfunktion, die wir an usort
muss ganze Zahlen zurückgeben für usort
richtig zu funktionieren:
Rücksendung nicht-ganzzahlig Werte aus der Vergleichsfunktion, wie z.B. float, führen zu einer internen Umwandlung des Rückgabewerts des Callbacks in integer. Werte wie 0,99 und 0,1 werden also beide in einen Integer-Wert von 0 umgewandelt, wodurch diese Werte als gleichwertig verglichen werden.
Dies ist ein wichtiger Fallstrick, der bei der Verwendung von usort
in PHP 5.x! Meine ursprüngliche Version dieser Antwort Ich habe diesen Fehler gemacht, und trotzdem habe ich zehn Upvotes bei Tausenden von Aufrufen erhalten, ohne dass jemand den schwerwiegenden Fehler bemerkt hat. Die Leichtigkeit, mit der Trottel wie ich Komparatorfunktionen vermasseln können, ist genau der Grund dafür, dass in PHP 7 der einfacher zu verwendende Raumschiff-Operator in die Sprache aufgenommen wurde.
3 Stimmen
Mögliche Duplikate von Wie sortiere ich ein mehrdimensionales Array in php
1 Stimmen
Warum strukturieren Sie Ihr Eingabefeld nicht einfach so um, dass die
price
Spalte steht an erster Stelle undtype
an zweiter Stelle? Auf diese Weise können Sie einfach aufrufenrsort()
. 3v4l.org/2meqs0 Stimmen
Kanonisch sortieren