PHP 7+
Depuis PHP 7, cela peut être fait de manière concise en utilisant usort
une fonction anonyme qui utilise l' opérateur du vaisseau spatial pour comparer les éléments.
Vous pouvez faire un tri croissant comme ceci:
usort($inventory, function ($item1, $item2) {
return $item1['price'] <=> $item2['price'];
});
Ou un tri décroissant comme celui-ci:
usort($inventory, function ($item1, $item2) {
return $item2['price'] <=> $item1['price'];
});
Pour comprendre comment cela fonctionne, notez que usort
prend une fonction de comparaison fournie par l'utilisateur qui doit se comporter comme suit (à partir des documents):
La fonction de comparaison doit renvoyer un entier inférieur, égal ou supérieur à zéro si le premier argument est considéré respectivement inférieur, égal ou supérieur au second.
Et notez également que <=>
, l'opérateur du vaisseau spatial,
renvoie 0 si les deux opérandes sont égaux, 1 si la gauche est supérieure et -1 si la droite est supérieure
c'est exactement ce qui a usort
besoin. En fait, presque toute la justification donnée pour ajouter <=>
au langage dans https://wiki.php.net/rfc/combined-comparison-operator est qu'il
rend l' écriture callbacks de commande pour une utilisation avec usort()
plus facile
PHP 5.3+
PHP 5.3 a introduit des fonctions anonymes, mais n'a pas encore d'opérateur de vaisseau spatial. Nous pouvons toujours utiliser usort
pour trier notre tableau, mais c'est un peu plus détaillé et plus difficile à comprendre:
usort($inventory, function ($item1, $item2) {
if ($item1['price'] == $item2['price']) return 0;
return $item1['price'] < $item2['price'] ? -1 : 1;
});
Notez que bien qu'il soit assez courant que les comparateurs traitant des valeurs entières renvoient simplement la différence des valeurs, comme $item2['price'] - $item1['price']
, nous ne pouvons pas le faire en toute sécurité dans ce cas. C'est parce que les prix sont des nombres à virgule flottante dans l'exemple du poseur de questions, mais la fonction de comparaison à laquelle nous passons usort
doit renvoyer des entiers pour usort
fonctionner correctement:
Revenant non entiers des valeurs de la fonction de comparaison, tel que le flotteur, se traduira par une distribution interne à nombre entier de la valeur de retour de la fonction de rappel. Ainsi, des valeurs telles que 0,99 et 0,1 seront toutes deux converties en une valeur entière de 0, qui comparera ces valeurs comme égales.
C'est un piège important à garder à l'esprit lors de l'utilisation usort
en PHP 5.x! Ma version originale de cette réponse a fait cette erreur et pourtant j'ai accumulé dix votes positifs sur des milliers de vues apparemment sans que personne ne remarque le bug sérieux. La facilité avec laquelle les astucieux comme moi peuvent bousiller les fonctions du comparateur est précisément la raison pour laquelle l'opérateur de vaisseau spatial plus facile à utiliser a été ajouté au langage en PHP 7.