strnatcasecmp()
A função strnatcasecmp() no PHP compara duas strings sem distinção de maiúsculas usando o algoritmo de "ordem natural".
Introdução
strnatcasecmp() compara duas strings usando um algoritmo de "ordem natural", ignorando maiúsculas e minúsculas. "Ordem natural" significa que os números incorporados nas strings são comparados pelo seu valor numérico, e não caractere por caractere — assim, "file2" vem antes de "file10", que é a ordem que uma pessoa usaria. A comparação alfabética simples usada por strcasecmp() colocaria "file10" primeiro, pois '1' vem antes de '2'.
Esta página aborda a assinatura da função, seu valor de retorno, como ela difere de outras funções de comparação relacionadas e como usá-la como callback de ordenação.
Sintaxe
strnatcasecmp(string $string1, string $string2): int| Parâmetro | Descrição |
|---|---|
$string1 | A primeira string a comparar. |
$string2 | A segunda string a comparar. |
A função é segura para binários (funciona com strings que contêm bytes nulos) e não diferencia maiúsculas de minúsculas ("FILE" e "file" são tratados como iguais).
Valor de retorno
strnatcasecmp() retorna um int cujo sinal indica o resultado — a magnitude exata é definida pela implementação, portanto, sempre compare com 0, não com um número específico:
| Retorno | Significado |
|---|---|
< 0 (negativo) | $string1 é menor que $string2 |
> 0 (positivo) | $string1 é maior que $string2 |
0 | As duas strings são iguais |
Exemplo básico
Como os números são comparados pelo valor (1 < 10), o resultado é:
file1.txt is less than file10.txtComparação natural vs. regular
Essa é a principal razão pela qual strnatcasecmp() existe. Com uma comparação regular, as strings são comparadas caractere por caractere, então '1' (o primeiro dígito de 10) vence '2'. A ordem natural analisa o número inteiro:
<?php
$a = "img12";
$b = "IMG2";
// Regular, case-insensitive: '1' < '2', so img12 comes first
echo strcasecmp($a, $b) . "\n"; // negative
// Natural, case-insensitive: 12 > 2, so img12 comes second
echo strnatcasecmp($a, $b) . "\n"; // positiveAs duas funções discordam na ordem e strnatcasecmp() ignora a diferença entre IMG e img, retornando o resultado mais intuitivo para humanos.
Ordenando um array de forma natural
O uso mais comum no mundo real é como callback de comparação para usort(), para ordenar nomes de arquivos ou strings semelhantes a versões:
<?php
$files = ["file10.txt", "File2.txt", "file1.txt"];
usort($files, "strnatcasecmp");
print_r($files);Saída:
Array
(
[0] => file1.txt
[1] => File2.txt
[2] => file10.txt
)Se você tiver um array que deseja ordenar no lugar por valor, natcasesort() aplica a mesma ordenação natural sem distinção de maiúsculas, preservando as chaves.
Funções relacionadas
| Função | Ordem natural? | Diferencia maiúsculas? |
|---|---|---|
strnatcasecmp() | Sim | Não |
strnatcmp() | Sim | Sim |
strcasecmp() | Não | Não |
strcmp() | Não | Sim |
Use strnatcasecmp() quando precisar de ordenação natural e insensibilidade a maiúsculas; escolha strnatcmp() se o caso for importante.
Conclusão
strnatcasecmp() compara duas strings na ordem que um ser humano esperaria — tratando números incorporados como números e ignorando maiúsculas e minúsculas. Sempre avalie o sinal do seu valor de retorno e utilize essa função (frequentemente junto com usort()) sempre que precisar ordenar nomes de arquivos, rótulos ou quaisquer strings que misturam texto e números.