usort()
Aprende cómo la función usort() de PHP ordena un array con un callback de comparación personalizado, con ejemplos de cadenas, números y objetos.
La función usort() de PHP ordena un array usando una función de comparación que tú escribes. Mientras que las funciones integradas como sort() solo saben ordenar valores de una manera (ascendente, por valor), usort() te permite expresar cualquier regla — ordenar objetos por una propiedad, números en un orden personalizado o cadenas con una regla de desempate. Esta página explica cómo funciona el callback de comparación, recorre ejemplos con cadenas, números y objetos, y cubre los errores comunes que confunden a los desarrolladores.
¿Qué es la función usort()?
La función usort() es una función integrada de PHP que ordena un array usando tu propia regla de comparación. A diferencia de las funciones de ordenación estándar que ordenan por valor o clave en orden ascendente o descendente, usort() requiere un callback para definir la lógica de comparación. Modifica el array original en su lugar y devuelve true en caso de éxito o false en caso de fallo (así que ordenas el array, no capturas el valor de retorno como el resultado ordenado).
Cómo funciona el callback de comparación
El callback recibe dos elementos, $a y $b, y debe devolver un entero que indica a usort() su orden relativo:
- un número negativo si
$adebe ir antes que$b, - un número positivo si
$adebe ir después de$b, 0si se consideran iguales.
Desde PHP 7, el operador nave espacial <=> hace exactamente esto en un solo paso: $a <=> $b devuelve -1, 0 o 1. La mayoría de los callbacks de comparación se reducen a un solo return utilizándolo.
Nota: usort() no es una ordenación estable. Si dos elementos se comparan como iguales, no se garantiza que se preserve su orden relativo original. A partir de PHP 8.0 la ordenación es estable, pero las versiones anteriores no lo son. Además, usort() reindexa el array de forma secuencial comenzando desde 0, por lo que se pierden las claves originales — usa uasort() si necesitas mantener las asociaciones de claves.
Sintaxis
La sintaxis de la función usort() es la siguiente:
La sintaxis de la función usort() en PHP
usort($array, $callback);Aquí, $array es el array que quieres ordenar, y $callback es la función de callback que define las reglas de ordenación personalizadas.
Parámetros y valor de retorno
| Parámetro | Tipo | Descripción |
|---|---|---|
$array | array | El array a ordenar. |
$callback | callable | Una función de comparación definida por el usuario. |
Valor de retorno: Devuelve true en caso de éxito o false en caso de fallo.
Ejemplo de uso
Veamos un ejemplo para entender cómo funciona la función usort(). Supongamos que tenemos un array de nombres que queremos ordenar alfabéticamente, pero con una regla personalizada en la que todos los nombres que empiezan con "J" deben aparecer primero.
¿Cómo usar la función usort() en PHP?
En este ejemplo, definimos una función de callback que compara dos nombres y devuelve -1, 0 o 1 según las reglas de ordenación personalizadas. Si la primera letra de $a es "J" y la primera letra de $b no es "J", entonces $a va antes que $b. Si la primera letra de $a no es "J" y la primera letra de $b es "J", entonces $b va antes que $a. Si ambos nombres comienzan con "J" o ninguno comienza con "J", usamos el operador nave espacial moderno de PHP (<=>) para comparar los nombres alfabéticamente.
Tras ejecutar este código, el array $names quedará ordenado de la siguiente manera:
Array
(
[0] => Jack
[1] => Jenny
[2] => John
[3] => Adam
[4] => Bob
)Ordenar objetos o arrays por un campo
El uso más común de usort() en el mundo real es ordenar una lista de registros (arrays asociativos u objetos) por uno de sus campos — algo que sort() no puede hacer. Aquí ordenamos una lista de productos por precio, de forma ascendente:
<?php
$products = [
["name" => "Book", "price" => 15],
["name" => "Pen", "price" => 2],
["name" => "Laptop", "price" => 900],
];
usort($products, fn ($a, $b) => $a["price"] <=> $b["price"]);
print_r(array_column($products, "name"));Toda la comparación es una sola expresión nave espacial. La salida, del más barato al más caro:
Array
(
[0] => Pen
[1] => Book
[2] => Laptop
)Para ordenar de forma descendente, simplemente intercambia los operandos: $b["price"] <=> $a["price"].
Errores comunes
- Mal uso del valor de retorno.
usort()devuelvetrue/false, no el array ordenado. Escribir$sorted = usort($arr, ...)te datrue, no tus datos. El array se ordena en su lugar. - Las claves se reinician. Las claves originales se descartan y se reemplazan por
0, 1, 2, …. Usauasort()para preservar las claves, ouksort()para ordenar por claves. - Devolver un boolean desde el callback. Devolver
$a > $b(un boolean) funciona por casualidad para el orden ascendente, pero falla para el descendente y los casos de igualdad. Siempre devuelve un entero — prefiere<=>.
Funciones relacionadas
sort()— ordena un array por valor, de forma ascendente, sin callback.asort()— ordena por valor preservando las claves.ksort()— ordena por clave.uasort()— comousort()pero preserva las asociaciones de claves.uksort()— ordena por claves usando un callback personalizado.
Conclusión
En este artículo, analizamos la función usort() en PHP y mostramos cómo puede usarse para ordenar arrays con reglas de ordenación personalizadas. Al definir una función de callback, puedes ordenar arrays en cualquier orden que desees, según tus propias reglas personalizadas. Esta función puede ser especialmente útil en situaciones donde las funciones de ordenación integradas de PHP no son suficientes para tus necesidades. Con la función usort(), tienes control total sobre cómo se ordenan tus arrays.