uasort()
Aprende a ordenar arrays asociativos en PHP con uasort(), preservando las claves mientras usas tu propia función de comparación.
Ordenar arrays en PHP con uasort()
La función uasort() de PHP ordena un array asociativo por sus valores usando una función de comparación que tú mismo escribes, mientras mantiene cada valor unido a su clave original. La "u" viene de user-defined (tú proporcionas la lógica de comparación) y la "a" viene de associative (se preservan los pares clave/valor).
Esta página explica qué hace uasort(), su sintaxis, cómo escribir una función de comparación correcta y ejemplos prácticos con arrays simples, asociativos y multidimensionales — cada resultado mostrado es la salida real al ejecutar el código.
Qué hace uasort() y cuándo usarla
La mayoría de las funciones de ordenación de PHP ignoran las claves o solo permiten ordenar con las reglas de comparación integradas. uasort() te da ambas cosas a la vez:
- Tú controlas el orden. Pasas un callback que decide cuál de dos valores va primero, de modo que puedes ordenar por longitud, por un campo anidado, en sentido inverso, por una lista de prioridades personalizada — cualquier cosa que puedas expresar en código.
- Las claves permanecen con sus valores. Después de ordenar,
$array["John"]sigue apuntando al valor de John; solo cambia el orden en que se iteran los pares.
Usa uasort() cuando se cumplan ambas condiciones: necesitas una regla personalizada y las claves son significativas (un nombre, un ID, un slug). Si las claves son simples posiciones desechables 0, 1, 2…, usort() es más sencilla porque las reindexará por ti. Si quieres ordenar por las claves en lugar de los valores, usa uksort(). Si solo necesitas una ordenación ascendente/descendente simple sin regla personalizada, asort() y arsort() lo hacen sin necesidad de callback.
Sintaxis
uasort(array &$array, callable $callback): boolarray &$array— el array a ordenar. El&significa que se pasa por referencia:uasort()ordena el array en su lugar y devuelvetrue/false, no devuelve un nuevo array ordenado.callable $callback— tu función de comparación. Recibe dos valores,$ay$b, y debe devolver un entero que indique a PHP su orden relativo.- Valor de retorno —
bool, siempretrue(devuelve un valor para poder usarse en expresiones, pero normalmente se llama por su efecto secundario sobre$array).
Dado que el array se modifica en su lugar, escribe
uasort($array, ...);en su propia línea — no escribas$array = uasort($array, ...), lo que sobreescribiría tus datos contrue.
Escribir la función de comparación
El callback compara dos valores y devuelve un entero:
- un número negativo si
$adebe ir antes que$b, 0si su orden no importa (se consideran iguales),- un número positivo si
$adebe ir después de$b.
La forma más limpia de producir ese resultado es el operador nave espacial <=>, que devuelve exactamente -1, 0 o 1:
// ascending
fn($a, $b) => $a <=> $b;
// descending — just flip the operands
fn($a, $b) => $b <=> $a;El estilo antiguo ($a < $b) ? -1 : 1 también funciona, pero nunca devuelve 0, por lo que los elementos iguales obtienen un orden arbitrario. Prefiere <=>; es más corto, correcto para el caso de igualdad y funciona con números, cadenas y arrays.
Ejemplo 1: Ordenar valores de un array indexado (claves preservadas)
Aquí uasort() ordena los números de forma ascendente, pero observa que las claves originales viajan con los valores — esa es la diferencia respecto a sort(), que los renumeraría 0…9.
Salida:
Array
(
[1] => 1
[3] => 1
[6] => 2
[0] => 3
[9] => 3
[2] => 4
[4] => 5
[8] => 5
[7] => 6
[5] => 9
)Ejemplo 2: Ordenar un array asociativo por valor
Este es el uso más común: ordenar personas por edad mientras se mantienen sus nombres como claves.
Salida:
Array
(
[Mary] => 28
[Jane] => 28
[John] => 32
[David] => 37
[Bob] => 45
)Para ordenar del mayor al menor, invierte los operandos: fn($a, $b) => $b <=> $a.
Ejemplo 3: Ordenar un array multidimensional por un campo anidado
Cuando cada elemento es a su vez un array, el callback recibe el sub-array completo, por lo que accedes a él para elegir el campo por el que ordenar. Aquí ordenamos por edad ([1]).
Salida:
Array
(
[1] => Array
(
[0] => Mary
[1] => 28
)
[3] => Array
(
[0] => Jane
[1] => 28
)
[0] => Array
(
[0] => John
[1] => 32
)
[4] => Array
(
[0] => David
[1] => 37
)
[2] => Array
(
[0] => Bob
[1] => 45
)
)Para filas con clave en un campo asociativo, sustituye $a[1] por algo como $a['age'].
uasort() vs usort()
Las funciones son idénticas excepto por las claves. Ejecuta los mismos datos con ambas:
<?php
$ages = ["John" => 32, "Mary" => 28, "Bob" => 45];
$copy = $ages;
usort($copy, fn($a, $b) => $a <=> $b);
echo "usort (keys lost):\n";
print_r($copy);
uasort($ages, fn($a, $b) => $a <=> $b);
echo "uasort (keys kept):\n";
print_r($ages);Salida:
usort (keys lost):
Array
(
[0] => 28
[1] => 32
[2] => 45
)
uasort (keys kept):
Array
(
[Mary] => 28
[John] => 32
[Bob] => 45
)Errores comunes
- Devuelve
true, no el array. Lee el resultado ordenado desde la variable que pasaste, no desde el valor de retorno. - La ordenación no es estable antes de PHP 8.0. Si dos valores son iguales, su orden relativo era definido por la implementación en versiones anteriores. Desde PHP 8.0, todas las funciones de ordenación (incluida
uasort()) son estables, por lo que los elementos iguales conservan su orden original. - Maneja siempre el caso de igualdad. Devolver
1para "no es menor que" (en lugar de0) puede desordenar elementos iguales en PHP antiguo y simplemente es incorrecto;<=>lo gestiona automáticamente.
Funciones relacionadas
usort()— la misma ordenación con regla personalizada, pero reindexando las claves.uksort()— ordena por claves con un callback personalizado.asort()/arsort()— ordenación por valor, ascendente/descendente, sin necesidad de callback.ksort()— ordena por claves sin callback.- Ordenar arrays en PHP — resumen de todas las funciones de ordenación y cuándo usar cada una.
Conclusión
uasort() es la herramienta para ordenar un array asociativo por valor con tu propia regla de comparación manteniendo las claves intactas. Combínala con el operador nave espacial para obtener callbacks limpios y correctos, recuerda que ordena en su lugar y elige esta función sobre usort() siempre que las claves tengan significado.