strcmp / strcasecmp / strncmp în PHP

Compară două texte și spune dacă primul este mai mic, egal sau mai mare decât al doilea.

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

Ce face strcmp / strcasecmp / strncmp

strcmp compară textele caracter cu caracter, după codul fiecărui octet. Returnează un număr negativ dacă primul text este „mai mic” (vine înainte în ordine), 0 dacă sunt identice și un număr pozitiv dacă primul este „mai mare”. Valoarea exactă nu contează, doar semnul.

strcasecmp face aceeași comparație, dar nu ține cont de litere mari și mici. strncmp compară doar primele $length caractere (există și strncasecmp, fără majuscule).

Sunt folosite mai ales ca funcție de comparare la sortare (usort). Pentru simpla verificare a egalității este suficient ===.

Parametri

Parametru Descriere
$string1 Primul text.
$string2 Al doilea text.
$length Doar la strncmp: câte caractere de la început se compară.

Ce returnează

Un număr negativ, 0 sau un număr pozitiv.

Exemple

Exemplul 1: Semnul rezultatului

Operatorul <=> transformă rezultatul în -1, 0 sau 1, ca să fie ușor de citit. Majusculele au coduri mai mici decât literele mici, de aceea „Ana” vine înaintea lui „ana”.

<?php
echo (strcmp("Ana", "Bogdan") <=> 0) . "\n";
echo (strcmp("Ana", "Ana") <=> 0) . "\n";
echo (strcmp("Ana", "ana") <=> 0) . "\n";
echo (strcasecmp("Ana", "ana") <=> 0);

Rezultat

-1
0
-1
0

Exemplul 2: Compararea doar a începutului cu strncmp

<?php
$coduri = ["RO123", "RO987", "BG456"];

foreach ($coduri as $cod) {
    if (strncmp($cod, "RO", 2) === 0) {
        echo "$cod este cod românesc\n";
    }
}

Rezultat

RO123 este cod românesc
RO987 este cod românesc

Exemplul 3: Sortare alfabetică fără să conteze majusculele

<?php
$orase = ["iași", "Cluj", "arad", "Brașov"];

usort($orase, "strcasecmp");
echo implode(", ", $orase);

Rezultat

arad, Brașov, Cluj, iași

Greșeli frecvente

  • Scrii if (strcmp($a, $b)) ca să verifici egalitatea. Condiția este adevărată când textele sunt diferite, pentru că egalitatea dă 0. Compară cu === 0 sau folosește direct $a === $b.
  • Te aștepți ca strcmp să returneze exact -1 sau 1. Poate returna orice număr negativ sau pozitiv. Verifică doar semnul.
  • Sortezi cuvinte cu diacritice: comparația pe octeți pune „ă” sau „ș” după „z”. Pentru ordinea alfabetică românească folosește clasa Collator din extensia intl.

Comenzi înrudite

  • strnatcmp / strnatcasecmp: Compară două texte în „ordine naturală”, în care img2 vine înaintea lui img10.
  • sort: Sortează elementele unui tablou crescător. Există și variante pentru descrescător și pentru chei.
  • strtolower / strtoupper: Transformă toate literele unui text în litere mici (strtolower) sau mari (strtoupper).