W3docs

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): true

natsort() 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 valoresnatsort() é 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, use explode() para transformá-la em um array, ordene e depois use implode() para reconstituí-la.
  • Comparação em pares. Internamente, usa a mesma lógica que strnatcmp(); para uma regra personalizada, ordene com usort() 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.

Prática

Prática
O que a função natsort() no PHP faz?
O que a função natsort() no PHP faz?
Was this page helpful?