Menu

Ordenar arrays en PHP: sort(), usort(), asort() y ksort()

sort($array) ordena una lista en el sitio, asort y ksort ordenan un array asociativo por valor o por clave, y usort ordena con tu propia comparación. Aprende todas, a ordenar un array multidimensional por una columna y a evitar el error clásico $sorted = sort($arr).

Esta página incluye editores ejecutables: edita, ejecuta y ve el resultado al instante.

sort($array) ordena un array en orden ascendente, en el sitio. Cambia la variable que le pasas y devuelve true, así que la llamas en su propia línea y luego usas el array. rsort() ordena en orden descendente.

PHP tiene una función de ordenación para cada combinación de "por valor o por clave", "ascendente o descendente" y "conservar las claves o no":

FunciónOrdena porOrdenClaves
sortvalorascendenterenumeradas 0, 1, 2
rsortvalordescendenterenumeradas
asortvalorascendentese conservan
arsortvalordescendentese conservan
ksortclaveascendentese conservan
krsortclavedescendentese conservan
usorttu funciónel que elijasrenumeradas
uasorttu funciónel que elijasse conservan
uksorttu función sobre las clavesel que elijasse conservan

Ordenar un array asociativo por valor

sort() con un array asociativo descarta las claves. Usa asort() para ordenar por valor y mantener cada clave con su valor, o arsort() para poner primero el más alto.

Ordenar un array por clave con ksort

ksort() ordena por clave y krsort() por clave a la inversa. Es útil antes de imprimir ajustes o de construir una query string en un orden estable.

Orden personalizado con usort y el operador nave espacial

usort($array, $callback) te deja decidir el orden. El callback recibe dos elementos y devuelve un número negativo si el primero debe ir antes, un número positivo si debe ir antes el segundo, y 0 si son iguales. El operador nave espacial <=> devuelve exactamente eso.

banana y cherry tienen la misma longitud, así que el callback devuelve 0 para ellas y se quedan en el orden que ya tenían. La ordenación de PHP es estable desde PHP 8.0: los elementos iguales mantienen su orden anterior.

Ordenar un array multidimensional por un valor

Para ordenar una lista de filas por un campo, compara ese campo en usort. Para ordenar por dos campos, compara arrays: <=> los compara elemento a elemento, así que el segundo campo solo desempata el primero.

La segunda comparación pone $b["age"] en el lado izquierdo y $a["age"] en el derecho, lo que invierte solo el orden por edad. array_multisort(array_column($people, 'city'), SORT_ASC, array_column($people, 'age'), SORT_DESC, $people) da el mismo orden sin callback: ordena por las columnas extraídas y reordena $people para que coincida.

Orden natural y flags de ordenación

Por defecto, PHP compara los números como números y las cadenas como cadenas. Los nombres de archivo con números se ordenan de una forma que la gente no espera: img10 va antes que img2, y todos los nombres en mayúsculas van antes que todos los de minúsculas. Los flags cambian cómo se comparan los valores.

SORT_NATURAL lee las secuencias de dígitos como números, SORT_FLAG_CASE ignora mayúsculas y minúsculas, y SORT_STRING fuerza una comparación carácter a carácter incluso con cadenas numéricas. natsort() y natcasesort() son la misma idea pero conservan las claves.

Error frecuente: asignar el resultado de sort

Todas las funciones de ordenación devuelven true y cambian el array que les pasas. Asignar el valor de retorno hace que pierdas el array:

Si necesitas una copia ordenada y quieres conservar el original, copia antes el array en una variable nueva y ordena la copia, como hace el ejemplo de asort de arriba con $copy.

Preguntas frecuentes

¿Por qué sort() devuelve true en lugar del array ordenado?

Las funciones de ordenación de PHP ordenan el array en el sitio, mediante una referencia, y devuelven true. Llama a sort($arr); en su propia línea y usa $arr después. Escribir $arr = sort($arr); sustituye tu array por true.

¿Cómo ordeno un array asociativo por valor conservando las claves?

Usa asort($arr) para orden ascendente o arsort($arr) para descendente. sort() y rsort() también ordenan por valor, pero descartan las claves y renumeran desde 0.

¿Cómo ordeno un array multidimensional por un valor en PHP?

Usa usort con el operador nave espacial sobre el campo: usort($rows, fn($a, $b) => $a['age'] <=> $b['age']);. Intercambia $a y $b para el orden descendente, y compara arrays como [$a['city'], $a['age']] <=> [$b['city'], $b['age']] para ordenar por dos campos.

¿La ordenación de PHP es estable?

Sí, desde PHP 8.0 todas las funciones de ordenación son estables: los elementos que se comparan como iguales mantienen el orden que tenían antes de ordenar. Eso es lo que hace que ordenar por un campo y luego por otro funcione como se espera.

¿Cómo ordeno cadenas con números en orden natural?

Usa natsort($arr) o sort($arr, SORT_NATURAL), que ponen img2 antes de img10. Añade SORT_FLAG_CASE (SORT_NATURAL | SORT_FLAG_CASE) o usa natcasesort para ignorar mayúsculas y minúsculas.

Ilustración de los lenguajes de programación de Coddy

Aprende a programar con Coddy

COMENZAR