strcmp()
La funzione strcmp() in PHP confronta due stringhe byte per byte e restituisce un intero che indica il loro ordine relativo.
Introduzione
strcmp() è la funzione integrata di PHP per confrontare due stringhe byte per byte (confronto "binary-safe"). Invece di rispondere "sono uguali?" con un boolean, restituisce un intero che indica anche il loro ordine relativo, che è esattamente ciò di cui gli algoritmi di ordinamento hanno bisogno. Questa pagina tratta la sintassi, il significato del valore restituito, gli errori comuni in cui si incorre e quando utilizzare una funzione correlata.
Sintassi
strcmp(string $string1, string $string2): intAccetta le due stringhe da confrontare e restituisce un int:
| Valore restituito | Significato |
|---|---|
0 | Le due stringhe sono esattamente uguali. |
< 0 (negativo) | $string1 viene prima di $string2. |
> 0 (positivo) | $string1 viene dopo $string2. |
È garantito solo il segno. La grandezza del risultato è un dettaglio implementativo (spesso, ma non sempre, corrisponde alla differenza ASCII del primo byte non corrispondente), quindi verifica sempre il segno — non confrontare mai con un numero specifico come
== -1o== 1.
Il confronto è case-sensitive e basato sui valori dei byte. Poiché le lettere ASCII maiuscole (A–Z, 65–90) precedono quelle minuscole (a–z, 97–122), "Z" è considerata "minore di" "a".
Esempio di base
"Hello" e "World" differiscono al primo carattere: H (72) rispetto a W (87). Poiché H viene prima, strcmp() restituisce un numero negativo e viene eseguito il secondo ramo, stampando The first string is less than the second string.
Come viene determinato il valore restituito
strcmp() scorre entrambe le stringhe un byte alla volta e si ferma alla prima posizione in cui differiscono, restituendo il segno della differenza di quel byte. Se una stringa è il prefisso dell'altra, la stringa più corta è "minore di" quella più lunga.
<?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'Il terzo caso è il classico errore: "apple" e "Apple" non sono uguali perché il confronto è case-sensitive.
Un errore comune: confronto per uguaglianza
strcmp() restituisce 0 quando le stringhe corrispondono, e 0 è falsy in PHP. Quindi questa condizione è invertita:
<?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 devi solo sapere se due stringhe sono uguali (non il loro ordine), l'operatore semplice === è più chiaro e veloce: $a === $b.
Ordinamento con strcmp()
Il vero punto di forza di strcmp() è come comparatore. usort() si aspetta una callback che restituisca un valore negativo, zero o positivo — esattamente il contratto di strcmp():
<?php
$fruits = ["banana", "Apple", "cherry", "apple"];
usort($fruits, "strcmp");
print_r($fruits);
// Array ( [0] => Apple [1] => apple [2] => banana [3] => cherry )"Apple" maiuscola viene per prima perché A (65) precede tutte le lettere minuscole. Per un ordinamento human-friendly e case-insensitive, usa strcasecmp().
Funzioni correlate
strcasecmp()— comestrcmp()ma case-insensitive.strncmp()— confronta solo i primi n byte di ogni stringa.strcoll()— confronto locale-aware (rispetta le regole di collazione del locale corrente).substr_compare()— confronta stringhe a partire da un dato offset.strpos()— trova la posizione di una sottostringa invece di confrontare stringhe intere.
Riepilogo
strcmp() esegue un confronto binary-safe e case-sensitive di due stringhe e restituisce 0 quando sono uguali, un numero negativo quando la prima precede l'altra, e un numero positivo quando la segue. Verifica sempre il segno del risultato (non un valore letterale come -1), ricorda che 0 è falsy quindi l'uguaglianza richiede un esplicito === 0, e usa strcasecmp(), strncmp() o strcoll() quando hai bisogno di confronti case-insensitive, parziali o locale-aware.