W3docs

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

Accetta le due stringhe da confrontare e restituisce un int:

Valore restituitoSignificato
0Le 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 == -1 o == 1.

Il confronto è case-sensitive e basato sui valori dei byte. Poiché le lettere ASCII maiuscole (AZ, 65–90) precedono quelle minuscole (az, 97–122), "Z" è considerata "minore di" "a".

Esempio di base

php— editable, runs on the server

"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() — come strcmp() 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.

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.

Esercitazione

Pratica
Cosa fa la funzione strcmp() in PHP?
Cosa fa la funzione strcmp() in PHP?
Was this page helpful?