W3docs

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âmetroDescrição
$string1A primeira string a comparar.
$string2A 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:

RetornoSignificado
< 0 (negativo)$string1 é menor que $string2
> 0 (positivo)$string1 é maior que $string2
0As duas strings são iguais

Exemplo básico

php— editable, runs on the server

Como os números são comparados pelo valor (1 < 10), o resultado é:

file1.txt is less than file10.txt

Comparaçã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";   // positive

As 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çãoOrdem natural?Diferencia maiúsculas?
strnatcasecmp()SimNão
strnatcmp()SimSim
strcasecmp()NãoNão
strcmp()NãoSim

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.

Prática

Prática
Qual é o papel da função strnatcasecmp() no PHP?
Qual é o papel da função strnatcasecmp() no PHP?
Was this page helpful?