Ordenación de Arrays
Aprende a ordenar arrays en PHP con sort(), rsort(), asort(), ksort(), natsort() y usort(). Guía completa con ejemplos prácticos.
Introducción a la ordenación de arrays en PHP
Un array en PHP es una colección de elementos almacenados y a los que se accede mediante un índice (una posición numérica) o una clave (una etiqueta). Ordenar significa reorganizar esos elementos en un orden definido — ascendente, descendente, por valor, por clave o según tu propia regla.
Esta página cubre las funciones de ordenación integradas de PHP, el comportamiento de cada una y — igualmente importante — cuál elegir dependiendo de si te importan las claves, los valores o un orden personalizado.
Diferencias entre las funciones de ordenación
Dos preguntas determinan qué función necesitas:
- ¿Ordenar por valor o por clave? Las listas simples (arrays indexados) ordenan por valor; los arrays asociativos pueden ordenar por cualquiera de los dos.
- ¿Mantener la asociación clave→valor?
sort()/rsort()descartan las claves originales y reindexan desde0. La familiaa*yk*preserva la asociación.
| Función | Ordena por | Orden | ¿Mantiene claves? |
|---|---|---|---|
sort() | valor | ascendente | no (reindexado) |
rsort() | valor | descendente | no (reindexado) |
asort() | valor | ascendente | sí |
arsort() | valor | descendente | sí |
ksort() | clave | ascendente | sí |
krsort() | clave | descendente | sí |
usort() | valor (personalizado) | tu regla | no (reindexado) |
uasort() | valor (personalizado) | tu regla | sí |
uksort() | clave (personalizado) | tu regla | sí |
Todas estas funciones ordenan el array en el lugar (mutan la variable que les pasas) y devuelven true en caso de éxito en lugar de un nuevo array — un punto de confusión frecuente para los principiantes.
Ordenar arrays en orden ascendente
La función sort() ordena un array en orden ascendente: las cadenas alfabéticamente, los números numéricamente. Modifica el array original en el lugar y lo reindexia desde 0, por lo que se pierden las claves originales. Evita mezclar tipos de datos en un mismo array, ya que las comparaciones entre cadenas y números, por ejemplo, pueden producir resultados sorprendentes.
$fruits = ['lemon', 'orange', 'banana', 'apple'];
sort($fruits);
print_r($fruits);
// Output: Array ( [0] => apple [1] => banana [2] => lemon [3] => orange )Ordenar arrays en orden descendente
La función rsort() es la inversa de sort() — ordena los elementos de mayor a menor. Al igual que sort(), actúa en el lugar y reindexia el array.
$numbers = [5, 2, 9, 1, 7];
rsort($numbers);
print_r($numbers);
// Output: Array ( [0] => 9 [1] => 7 [2] => 5 [3] => 2 [4] => 1 )Ordenar arrays asociativos por valor
Cuando las claves tienen significado (nombres, IDs, etiquetas), usa las funciones a* para que los pares clave→valor permanezcan juntos. La función asort() ordena por valor en orden ascendente; arsort() hace lo mismo en orden descendente.
$ages = ['Peter' => 35, 'John' => 28, 'Mary' => 32];
asort($ages);
print_r($ages);
// Output: Array ( [John] => 28 [Mary] => 32 [Peter] => 35 )Observa que cada nombre permanece vinculado a su edad — esa es la diferencia respecto a sort(), que descartaría los nombres.
Ordenar arrays asociativos por clave
La función ksort() ordena por clave en orden ascendente manteniendo cada clave ligada a su valor; krsort() ordena por clave en orden descendente.
$colors = ['red' => '#FF0000', 'blue' => '#0000FF', 'green' => '#008000'];
ksort($colors);
print_r($colors);
// Output: Array ( [blue] => #0000FF [green] => #008000 [red] => #FF0000 )Ordenación de orden natural
Una ordenación de cadenas normal compara carácter por carácter, por lo que 'img10' se ordena antes que 'img2' (porque '1' < '2'). La función natsort() utiliza un algoritmo de "orden natural" que compara los números incrustados como números — de la misma forma en que un humano ordenaría nombres de archivos. Preserva las claves.
$files = ['img12.png', 'img10.png', 'img2.png', 'img1.png'];
natsort($files);
print_r($files);
// Output: Array ( [3] => img1.png [2] => img2.png [1] => img10.png [0] => img12.png )Usa natcasesort() para el mismo comportamiento ignorando mayúsculas y minúsculas.
Ordenación personalizada con usort()
Cuando los órdenes integrados no son suficientes — para ordenar objetos, arrays multidimensionales o por un valor derivado — usort() te permite suministrar tu propia función de comparación. El callback recibe dos elementos y debe devolver un número negativo, 0, o un número positivo dependiendo de si el primero debe ir antes, igual o después que el segundo.
$people = [
['name' => 'Mary', 'age' => 32],
['name' => 'Peter', 'age' => 35],
['name' => 'John', 'age' => 28],
];
usort($people, function ($a, $b) {
return $a['age'] <=> $b['age']; // spaceship operator: ascending by age
});
foreach ($people as $person) {
echo $person['name'] . ': ' . $person['age'] . "\n";
}
// Output:
// John: 28
// Mary: 32
// Peter: 35El operador "nave espacial" <=> devuelve exactamente el -1 / 0 / 1 que el callback necesita, lo que lo convierte en la opción idiomática aquí. Si necesitas conservar las claves, usa uasort(); para ordenar por una regla de clave personalizada, usa uksort().
Elegir la función correcta
- Lista simple, sin importar las claves →
sort()/rsort(). - Array asociativo, ordenar por valor, mantener claves →
asort()/arsort(). - Array asociativo, ordenar por clave →
ksort()/krsort(). - Nombres de archivos o cadenas similares a versiones →
natsort()/natcasesort(). - Objetos, arrays anidados o cualquier regla personalizada →
usort()/uasort()/uksort().
Si solo necesitas invertir el orden existente sin reordenar, array_reverse() es más eficiente que una ordenación completa. Para ordenar múltiples arrays juntos o por múltiples columnas, consulta array_multisort().
Conclusión
PHP incluye un conjunto completo de herramientas para ordenar arrays, y la elección correcta depende de dos preguntas: ¿estás ordenando por valor o por clave, y necesitas mantener las claves vinculadas? sort() y rsort() gestionan listas simples, la familia a*/k* gestiona datos asociativos, natsort() gestiona el orden legible por humanos y la familia u* gestiona cualquier caso personalizado. Recuerda que todas estas funciones ordenan en el lugar y devuelven un boolean — no un nuevo array.