strcmp()
A função strcmp() do PHP compara duas strings byte a byte e retorna um inteiro indicando a ordem relativa entre elas.
Introdução
strcmp() é a função nativa do PHP para comparar duas strings byte a byte (comparação "binária segura"). Em vez de responder "são iguais?" com um booleano, ela retorna um inteiro que também indica a ordem relativa das strings, o que é exatamente o que os algoritmos de ordenação precisam. Esta página cobre a sintaxe, o significado do valor de retorno, as armadilhas mais comuns e quando usar uma função relacionada.
Sintaxe
strcmp(string $string1, string $string2): intRecebe as duas strings a comparar e retorna um int:
| Valor de retorno | Significado |
|---|---|
0 | As duas strings são exatamente iguais. |
< 0 (negativo) | $string1 vem antes de $string2. |
> 0 (positivo) | $string1 vem depois de $string2. |
Apenas o sinal é garantido. A magnitude do resultado é um detalhe de implementação (frequentemente, mas nem sempre, a diferença ASCII do primeiro byte diferente), portanto sempre teste o sinal — nunca compare com um número específico como
== -1ou== 1.
A comparação é sensível a maiúsculas e minúsculas e baseada em valores de bytes. Como as letras maiúsculas ASCII (A–Z, 65–90) vêm antes das minúsculas (a–z, 97–122), "Z" é considerado "menor que" "a".
Exemplo básico
"Hello" e "World" diferem no primeiro caractere: H (72) versus W (87). Como H vem primeiro, strcmp() retorna um número negativo e o segundo bloco é executado, imprimindo The first string is less than the second string.
Como o valor de retorno é determinado
strcmp() percorre ambas as strings byte a byte e para na primeira posição em que diferem, retornando o sinal da diferença entre os bytes. Se uma string é prefixo da outra, a string mais curta é considerada "menor que" a mais longa.
<?php
var_dump(strcmp("apple", "apple")); // int(0) — identical
var_dump(strcmp("apple", "apples")); // negative int — "apple" is shorter (a prefix)
var_dump(strcmp("apple", "Apple")); // positive int — 'a'(97) > 'A'(65)
var_dump(strcmp("abc", "abd")); // negative int — differ at 3rd char: 'c' < 'd'O terceiro caso é a armadilha clássica: "apple" e "Apple" não são iguais porque a comparação é sensível a maiúsculas e minúsculas.
Um erro comum: comparar por igualdade
strcmp() retorna 0 quando as strings são iguais, e 0 é falsy em PHP. Portanto, esta condição está invertida:
<?php
$a = "secret";
$b = "secret";
// WRONG: this block runs only when the strings are DIFFERENT
if (strcmp($a, $b)) {
echo "match"; // never printed for equal strings
}
// RIGHT: test explicitly against 0
if (strcmp($a, $b) === 0) {
echo "match"; // prints "match"
}Se você só precisa saber se duas strings são iguais (não a ordem delas), o operador === é mais claro e rápido: $a === $b.
Ordenação com strcmp()
O verdadeiro poder de strcmp() está em seu uso como comparador. usort() espera um callback que retorne um valor negativo, zero ou positivo — exatamente o contrato de strcmp():
<?php
$fruits = ["banana", "Apple", "cherry", "apple"];
usort($fruits, "strcmp");
print_r($fruits);
// Array ( [0] => Apple [1] => apple [2] => banana [3] => cherry )"Apple" com maiúscula vem primeiro porque A (65) é ordenado antes de todas as letras minúsculas. Para uma ordenação amigável ao usuário e insensível a maiúsculas, use strcasecmp().
Funções relacionadas
strcasecmp()— igual astrcmp(), mas insensível a maiúsculas e minúsculas.strncmp()— compara apenas os primeiros n bytes de cada string.strcoll()— comparação baseada em locale (respeita as regras de ordenação do locale atual).substr_compare()— compara strings a partir de um deslocamento fornecido.strpos()— encontra a posição de uma substring em vez de comparar strings inteiras.
Resumo
strcmp() realiza uma comparação binária segura e sensível a maiúsculas e minúsculas entre duas strings, retornando 0 quando são iguais, um número negativo quando a primeira vem antes e um número positivo quando vem depois. Sempre verifique o sinal do resultado (não um valor literal como -1), lembre-se de que 0 é falsy, portanto a verificação de igualdade requer um === 0 explícito, e use strcasecmp(), strncmp() ou strcoll() quando precisar de comparações insensíveis a maiúsculas, parciais ou baseadas em locale.