PHP 7+
A partir de PHP 7, esto se puede hacer de manera concisa usando usort
una función anónima que usa el operador de nave espacial para comparar elementos.
Puedes hacer un tipo ascendente como este:
usort($inventory, function ($item1, $item2) {
return $item1['price'] <=> $item2['price'];
});
O un tipo descendente como este:
usort($inventory, function ($item1, $item2) {
return $item2['price'] <=> $item1['price'];
});
Para comprender cómo funciona esto, tenga en cuenta que usort
toma una función de comparación proporcionada por el usuario que debe comportarse de la siguiente manera (de los documentos):
La función de comparación debe devolver un número entero menor que, igual o mayor que cero si el primer argumento se considera respectivamente menor, igual o mayor que el segundo.
Y tenga en cuenta también que <=>
, el operador de la nave espacial,
devuelve 0 si ambos operandos son iguales, 1 si la izquierda es mayor y -1 si la derecha es mayor
que es exactamente lo que usort
necesita De hecho, casi toda la justificación dada para agregar <=>
al lenguaje en https://wiki.php.net/rfc/combined-comparison-operator es que
facilita la escritura de devoluciones de llamadas de pedidos para usar con usort()
más facilidad
PHP 5.3+
PHP 5.3 introdujo funciones anónimas, pero aún no tiene el operador de nave espacial. Todavía podemos usar usort
para ordenar nuestra matriz, pero es un poco más detallado y más difícil de entender:
usort($inventory, function ($item1, $item2) {
if ($item1['price'] == $item2['price']) return 0;
return $item1['price'] < $item2['price'] ? -1 : 1;
});
Tenga en cuenta que, aunque es bastante común que los comparadores que tratan con valores enteros solo devuelvan la diferencia de los valores, por ejemplo $item2['price'] - $item1['price']
, no podemos hacerlo con seguridad en este caso. Esto se debe a que los precios son números de coma flotante en el ejemplo del autor de la pregunta, pero la función de comparación a la que pasamos usort
tiene que devolver enteros para usort
que funcionen correctamente:
La devolución de valores no enteros de la función de comparación, como float, dará como resultado una conversión interna a un entero del valor de retorno de la devolución de llamada. Por lo tanto, los valores como 0.99 y 0.1 se convertirán en un valor entero de 0, que comparará dichos valores como iguales.
¡Esta es una trampa importante a tener en cuenta al usar usort
PHP 5.x! Mi versión original de esta respuesta cometió este error y, sin embargo, acumulé diez votos a favor en miles de visitas aparentemente sin que nadie se diera cuenta del error grave. La facilidad con la que los imbéciles como yo pueden arruinar las funciones de comparación es precisamente la razón por la que el operador de nave espacial más fácil de usar se agregó al lenguaje en PHP 7.