W3docs

Cómo ordenar cadenas en orden natural en PHP

Aprende a usar natsort() en PHP para ordenar cadenas con números en orden natural, respetando los valores numéricos de los dígitos.

Cuando ordenas cadenas que contienen números en PHP, el ordenamiento alfabético predeterminado suele producir resultados que parecen "incorrectos" para un lector humano. La función natsort() de PHP soluciona esto ordenando un array mediante un algoritmo de orden natural — de la misma forma en que una persona ordenaría file1, file2, file10 en lugar de file1, file10, file2.

Esta página explica qué es el ordenamiento en orden natural, cómo funciona natsort() (incluido el hecho de que preserva las claves), cómo se diferencia de sort(), cómo manejar mayúsculas y minúsculas, y los errores comunes.

¿Qué es el ordenamiento en orden natural?

El ordenamiento en orden natural (también llamado ordenamiento alfanumérico) trata las secuencias de dígitos dentro de una cadena como un único número en lugar de caracteres individuales. Con un ordenamiento alfabético simple, "100" viene antes que "2" porque la comparación se detiene en el primer carácter y '1' es menor que '2' en la tabla ASCII. El ordenamiento en orden natural compara 100 y 2 como números, por lo que 2 aparece correctamente primero.

Esto importa siempre que tus cadenas mezclen texto y números — nombres de archivo (img10.png), etiquetas de versión (v2.13), o elementos como "10 manzanas" y "2 naranjas".

Sintaxis

natsort(array &$array): true

natsort() recibe el array por referencia, lo ordena en su lugar y (a partir de PHP 8.2) siempre devuelve true. En versiones anteriores, el tipo de retorno es bool. Como el array se modifica directamente, no debes asignar el resultado de vuelta — lees la variable original después de la llamada.

Cómo usar la función natsort()

Compara el orden natural con el ordenamiento alfabético regular sort():

$fruits = array("10 apples", "2 oranges", "100 bananas");

natsort($fruits);
print_r($fruits);

Salida:

Array
(
    [1] => 2 oranges
    [0] => 10 apples
    [2] => 100 bananas
)

Observa que las claves originales (1, 0, 2) se mantienen y se mueven con sus valoresnatsort() es un ordenamiento que preserva claves, igual que asort(). Si ejecutaras el sort() simple en su lugar, obtendrías el resultado alfabético (y reindexado):

Array
(
    [0] => 10 apples
    [1] => 100 bananas
    [2] => 2 oranges
)

Aquí "100 bananas" queda en el medio porque sort() lo compara carácter por carácter.

Ordenar nombres similares a archivos

El caso de uso clásico es ordenar nombres de archivo que terminan en números:

$files = array("file20", "file3", "file1");

natsort($files);
print_r($files);

Salida:

Array
(
    [2] => file1
    [1] => file3
    [0] => file20
)

Un ordenamiento regular colocaría file20 antes que file3 — rara vez lo que deseas al listar archivos.

natsort() distingue entre mayúsculas y minúsculas

natsort() compara las letras mayúsculas antes que las minúsculas (los códigos ASCII de mayúsculas son menores). Por lo tanto, la entrada con mayúsculas y minúsculas mezcladas agrupa primero las mayúsculas:

$images = array("img12", "img10", "IMG2", "img1");

natsort($images);
print_r($images);

Salida:

Array
(
    [2] => IMG2
    [3] => img1
    [1] => img10
    [0] => img12
)

IMG2 se ordena antes que los nombres en minúsculas. Cuando se deba ignorar el caso, usa la variante sin distinción de mayúsculas natcasesort():

$images = array("img12", "img10", "IMG2", "img1");

natcasesort($images);
print_r($images);

Salida:

Array
(
    [3] => img1
    [2] => IMG2
    [1] => img10
    [0] => img12
)

Advertencias y limitaciones

  • Las claves se preservan. Si necesitas un índice limpio de base cero después, ejecuta array_values($array) una vez que el ordenamiento esté completo.
  • Ordena en su lugar. El array se pasa por referencia; no escribas $x = natsort($arr) — eso almacena el valor booleano de retorno, no el array ordenado.
  • Distingue mayúsculas y minúsculas por defecto. Recurre a natcasesort() cuando el caso no deba afectar el orden.
  • Solo arrays. natsort() no funciona con cadenas u objetos. Para ordenar una cadena delimitada, sepárala con explode() en un array, ordénala y luego vuelve a unirla con implode().
  • Comparación por pares. Internamente usa la misma lógica que strnatcmp(); para una regla personalizada, ordena con usort() y tu propio comparador.

Conclusión

natsort() ordena un array en orden natural amigable para el ser humano, tratando los números embebidos como valores numéricos y preservando las claves del array. Úsalo para nombres de archivo, cadenas de versión y cualquier lista que mezcle texto con números — cambia a natcasesort() cuando el caso no importe, y recuerda reindexar con array_values() si necesitas claves secuenciales. Para otras necesidades de ordenamiento, explora las funciones de ordenamiento de arrays relacionadas.

Práctica

Práctica
¿Qué hace la función natsort() en PHP?
¿Qué hace la función natsort() en PHP?
Was this page helpful?