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:
usort($inventory, function ($item1, $item2) {
return $item1['price'] <=> $item2['price'];
});
Oder eine absteigende Sorte wie diese:
usort($inventory, function ($item1, $item2) {
return $item2['price'] <=> $item1['price'];
});
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):
Die Vergleichsfunktion muss eine Ganzzahl zurückgeben, die kleiner, gleich oder größer als Null ist, wenn das erste Argument als kleiner, gleich oder größer als das zweite angesehen wird.
Und beachten Sie auch, dass <=>
der Raumschiffbetreiber,
Gibt 0 zurück, wenn beide Operanden gleich sind, 1, wenn die linke größer ist, und -1, wenn die rechte größer ist
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 ist
usort()
erleichtert das Schreiben von Bestellrückrufen zur Verwendung mit
PHP 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:
usort($inventory, function ($item1, $item2) {
if ($item1['price'] == $item2['price']) return 0;
return $item1['price'] < $item2['price'] ? -1 : 1;
});
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, damit usort
sie ordnungsgemäß funktioniert:
Das Zurückgeben von nicht ganzzahligen Werten aus der Vergleichsfunktion, z. B. float, führt zu einer internen Umwandlung in eine Ganzzahl des Rückgabewerts des Rückrufs. Werte wie 0,99 und 0,1 werden also beide auf einen ganzzahligen Wert von 0 umgewandelt, wodurch solche Werte als gleich verglichen werden.
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.