Como Ordenar Strings em Ordem Natural no PHP
Aprenda a usar natsort() no PHP para ordenar strings com números de forma natural, preservando chaves e comparando valores numéricos corretamente.
Quando você ordena strings que contêm números no PHP, a ordenação alfabética padrão frequentemente produz resultados que parecem "errados" para um leitor humano. A função natsort() do PHP resolve isso ordenando um array usando um algoritmo de ordem natural — da mesma forma que uma pessoa ordenaria file1, file2, file10 em vez de file1, file10, file2.
Esta página aborda o que é a ordenação em ordem natural, como natsort() funciona (incluindo o fato de que ela preserva as chaves), como ela difere de sort(), como lidar com maiúsculas e minúsculas, e as armadilhas comuns.
O que é ordenação em ordem natural?
A ordenação em ordem natural (também chamada de ordenação alfanumérica) trata sequências de dígitos dentro de uma string como um único número, em vez de caracteres individuais. Com uma ordenação puramente alfabética, "100" vem antes de "2" porque a comparação para no primeiro caractere e '1' é menor que '2' na tabela ASCII. A ordenação em ordem natural, por outro lado, compara 100 e 2 como números, portanto 2 vem corretamente primeiro.
Isso importa sempre que suas strings misturam texto e números — nomes de arquivos (img10.png), rótulos de versão (v2.13) ou itens como "10 maçãs" e "2 laranjas".
Sintaxe
natsort(array &$array): truenatsort() recebe o array por referência, ordena-o no próprio lugar e (a partir do PHP 8.2) sempre retorna true. Em versões mais antigas, o tipo de retorno é bool. Como o array é modificado diretamente, você não atribui o resultado de volta — leia a variável original após a chamada.
Como usar a função natsort()
Compare a ordem natural com a ordenação alfabética regular sort():
$fruits = array("10 apples", "2 oranges", "100 bananas");
natsort($fruits);
print_r($fruits);Saída:
Array
(
[1] => 2 oranges
[0] => 10 apples
[2] => 100 bananas
)Observe que as chaves originais (1, 0, 2) são mantidas e movidas junto com seus valores — natsort() é uma ordenação que preserva as chaves, assim como asort(). Se você executasse o sort() simples, obteria o resultado alfabético (e reindexado):
Array
(
[0] => 10 apples
[1] => 100 bananas
[2] => 2 oranges
)Aqui "100 bananas" fica no meio porque sort() compara caractere por caractere.
Ordenando nomes semelhantes a arquivos
O caso de uso clássico é ordenar nomes de arquivos que terminam com números:
$files = array("file20", "file3", "file1");
natsort($files);
print_r($files);Saída:
Array
(
[2] => file1
[1] => file3
[0] => file20
)Uma ordenação regular colocaria file20 antes de file3 — raramente o que se deseja ao listar arquivos.
natsort() diferencia maiúsculas de minúsculas
natsort() compara letras maiúsculas antes das minúsculas (os códigos ASCII de maiúsculas são menores). Entradas com maiúsculas e minúsculas misturadas, portanto, agrupam as letras maiúsculas primeiro:
$images = array("img12", "img10", "IMG2", "img1");
natsort($images);
print_r($images);Saída:
Array
(
[2] => IMG2
[3] => img1
[1] => img10
[0] => img12
)IMG2 aparece antes dos nomes em minúsculas. Quando o caso deve ser ignorado, use a variante sem distinção de maiúsculas e minúsculas natcasesort():
$images = array("img12", "img10", "IMG2", "img1");
natcasesort($images);
print_r($images);Saída:
Array
(
[3] => img1
[2] => IMG2
[1] => img10
[0] => img12
)Ressalvas e limitações
- As chaves são preservadas. Se você precisar de um índice limpo e com base zero depois, execute
array_values($array)após a ordenação. - Ordena no próprio lugar. O array é passado por referência; não escreva
$x = natsort($arr)— isso armazena o valor boolean de retorno, não o array ordenado. - Diferencia maiúsculas e minúsculas por padrão. Recorra a
natcasesort()quando o caso não deve afetar a ordem. - Somente arrays.
natsort()não funciona em strings ou objetos. Para ordenar uma string delimitada, useexplode()para transformá-la em um array, ordene e depois useimplode()para reconstituí-la. - Comparação em pares. Internamente, usa a mesma lógica que
strnatcmp(); para uma regra personalizada, ordene comusort()e seu próprio comparador.
Conclusão
natsort() ordena um array em ordem natural amigável para humanos, tratando números incorporados como valores numéricos enquanto preserva as chaves do array. Use-a para nomes de arquivos, strings de versão e qualquer lista que misture texto com números — mude para natcasesort() quando o caso não importar, e lembre-se de reindexar com array_values() se precisar de chaves sequenciais. Para outras necessidades de ordenação, explore as funções de ordenação de arrays relacionadas.