strcmp()
La fonction strcmp() en PHP compare deux chaînes octet par octet et retourne un entier indiquant leur ordre relatif ou leur égalité.
Introduction
strcmp() est la fonction intégrée de PHP pour comparer deux chaînes octet par octet (comparaison « binaire sûre »). Plutôt que de répondre « sont-elles égales ? » avec un booléen, elle retourne un entier qui indique également leur ordre relatif, ce dont les algorithmes de tri ont précisément besoin. Cette page couvre la syntaxe, la signification de la valeur de retour, les pièges courants et les cas où utiliser une fonction apparentée.
Syntaxe
strcmp(string $string1, string $string2): intElle prend les deux chaînes à comparer et retourne un int :
| Valeur de retour | Signification |
|---|---|
0 | Les deux chaînes sont exactement égales. |
< 0 (négatif) | $string1 se classe avant $string2. |
> 0 (positif) | $string1 se classe après $string2. |
Seul le signe est garanti. La magnitude du résultat est un détail d'implémentation (il s'agit souvent, mais pas toujours, de la différence ASCII du premier octet non correspondant), donc testez toujours le signe — ne comparez jamais contre un nombre spécifique comme
== -1ou== 1.
La comparaison est sensible à la casse et basée sur les valeurs d'octets. Comme les lettres majuscules ASCII (A–Z, 65–90) précèdent les minuscules (a–z, 97–122), "Z" est considéré comme « inférieur à » "a".
Exemple de base
"Hello" et "World" diffèrent dès le premier caractère : H (72) contre W (87). Comme H vient en premier, strcmp() retourne un nombre négatif et la deuxième branche s'exécute, affichant The first string is less than the second string.
Comment la valeur de retour est déterminée
strcmp() parcourt les deux chaînes octet par octet et s'arrête à la première position où elles diffèrent, en retournant le signe de cette différence d'octets. Si une chaîne est un préfixe de l'autre, la chaîne la plus courte est « inférieure à » la plus longue.
<?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'Ce troisième cas est le piège classique : "apple" et "Apple" ne sont pas égaux car la comparaison est sensible à la casse.
Une erreur courante : comparer pour l'égalité
strcmp() retourne 0 lorsque les chaînes correspondent, et 0 est faux (falsy) en PHP. Cette condition est donc à l'envers :
<?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 vous avez seulement besoin de savoir si deux chaînes sont égales (pas leur ordre), l'opérateur === est plus clair et plus rapide : $a === $b.
Trier avec strcmp()
La vraie force de strcmp() est son utilisation comme comparateur. usort() attend un rappel qui retourne une valeur négative, nulle ou positive — exactement le contrat 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 majuscule arrive en premier car A (65) se classe avant toutes les lettres minuscules. Pour un tri insensible à la casse plus convivial, utilisez strcasecmp() à la place.
Fonctions apparentées
strcasecmp()— identique àstrcmp()mais insensible à la casse.strncmp()— compare uniquement les n premiers octets de chaque chaîne.strcoll()— comparaison tenant compte des paramètres régionaux (respecte les règles de classement de la locale actuelle).substr_compare()— compare des chaînes à partir d'un décalage donné.strpos()— trouve la position d'une sous-chaîne plutôt que de comparer des chaînes entières.
Résumé
strcmp() effectue une comparaison binaire sûre et sensible à la casse de deux chaînes, et retourne 0 lorsqu'elles sont égales, un nombre négatif lorsque la première se classe avant, et un nombre positif lorsqu'elle se classe après. Vérifiez toujours le signe du résultat (pas un littéral comme -1), souvenez-vous que 0 est faux en PHP donc l'égalité nécessite un === 0 explicite, et utilisez strcasecmp(), strncmp() ou strcoll() pour des comparaisons insensibles à la casse, partielles ou tenant compte des paramètres régionaux.