W3docs

strcmp()

La función strcmp() en PHP compara dos cadenas byte a byte y devuelve un entero que indica su orden relativo.

Introducción

strcmp() es la función integrada de PHP para comparar dos cadenas byte a byte (comparación "binary-safe"). En lugar de responder "¿son iguales?" con un boolean, devuelve un entero que también indica su orden relativo, que es exactamente lo que necesitan los algoritmos de ordenamiento. Esta página cubre la sintaxis, el significado del valor de retorno, los errores comunes y cuándo usar una función relacionada en su lugar.

Sintaxis

strcmp(string $string1, string $string2): int

Toma las dos cadenas a comparar y devuelve un int:

Valor de retornoSignificado
0Las dos cadenas son exactamente iguales.
< 0 (negativo)$string1 se ordena antes que $string2.
> 0 (positivo)$string1 se ordena después que $string2.

Solo se garantiza el signo. La magnitud del resultado es un detalle de implementación (a menudo, pero no siempre, es la diferencia ASCII del primer byte que no coincide), por lo que siempre comprueba el signo — nunca compares contra un número específico como == -1 o == 1.

La comparación es sensible a mayúsculas/minúsculas y se basa en valores de bytes. Debido a que las letras ASCII en mayúscula (AZ, 65–90) vienen antes que las minúsculas (az, 97–122), "Z" se considera "menor que" "a".

Ejemplo básico

php— editable, runs on the server

"Hello" y "World" difieren en el primer carácter: H (72) frente a W (87). Como H viene primero, strcmp() devuelve un número negativo y se ejecuta la segunda rama, imprimiendo The first string is less than the second string.

Cómo se determina el valor de retorno

strcmp() recorre ambas cadenas byte a byte y se detiene en la primera posición donde difieren, devolviendo el signo de esa diferencia de bytes. Si una cadena es prefijo de la otra, la cadena más corta es "menor que" la más larga.

<?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'

El tercer caso es el error clásico: "apple" y "Apple" no son iguales porque la comparación distingue entre mayúsculas y minúsculas.

Un error común: comparar por igualdad

strcmp() devuelve 0 cuando las cadenas coinciden, y 0 es falsy en PHP. Por lo tanto, esta condición está al revés:

<?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"
}

Si solo necesitas saber si dos cadenas son iguales (sin importar el orden), el operador === es más claro y rápido: $a === $b.

Ordenamiento con strcmp()

La verdadera fortaleza de strcmp() es como comparador. usort() espera un callback que devuelva un valor negativo, cero o positivo — exactamente el 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" en mayúscula aparece primero porque A (65) se ordena antes que todas las letras minúsculas. Para un orden amigable para humanos, sin distinción de mayúsculas/minúsculas, usa strcasecmp() en su lugar.

Funciones relacionadas

  • strcasecmp() — igual que strcmp() pero sin distinción de mayúsculas/minúsculas.
  • strncmp() — compara solo los primeros n bytes de cada cadena.
  • strcoll() — comparación según la configuración regional (respeta las reglas de cotejo del locale actual).
  • substr_compare() — compara cadenas a partir de un desplazamiento dado.
  • strpos() — encuentra la posición de una subcadena en lugar de comparar cadenas completas.

Resumen

strcmp() realiza una comparación binary-safe y sensible a mayúsculas/minúsculas de dos cadenas, y devuelve 0 cuando son iguales, un número negativo cuando la primera se ordena antes, y un número positivo cuando se ordena después. Siempre comprueba el signo del resultado (no un literal como -1), recuerda que 0 es falsy, por lo que la igualdad requiere un === 0 explícito, y recurre a strcasecmp(), strncmp() o strcoll() cuando necesites comparaciones sin distinción de mayúsculas/minúsculas, parciales o según la configuración regional.

Práctica

Práctica
¿Qué hace la función strcmp() en PHP?
¿Qué hace la función strcmp() en PHP?
Was this page helpful?