W3docs

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

Recebe as duas strings a comparar e retorna um int:

Valor de retornoSignificado
0As 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 == -1 ou == 1.

A comparação é sensível a maiúsculas e minúsculas e baseada em valores de bytes. Como as letras maiúsculas ASCII (AZ, 65–90) vêm antes das minúsculas (az, 97–122), "Z" é considerado "menor que" "a".

Exemplo básico

php— editable, runs on the server

"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 a strcmp(), 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.

Prática

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