strnatcasecmp()
La funzione strnatcasecmp() in PHP confronta due stringhe senza distinzione tra maiuscole e minuscole usando un algoritmo di "ordine naturale".
Introduzione
strnatcasecmp() confronta due stringhe usando un algoritmo di "ordine naturale", ignorando le maiuscole. L'"ordine naturale" significa che i numeri incorporati nelle stringhe vengono confrontati in base al loro valore numerico anziché carattere per carattere — quindi "file2" viene prima di "file10", come ci si aspetterebbe. Il confronto alfabetico normale usato da strcasecmp() invece mette "file10" per primo, perché '1' viene prima di '2'.
Questa pagina illustra la firma della funzione, il suo valore di ritorno, le differenze rispetto alle funzioni di confronto correlate e come utilizzarla come callback di ordinamento.
Sintassi
strnatcasecmp(string $string1, string $string2): int| Parametro | Descrizione |
|---|---|
$string1 | La prima stringa da confrontare. |
$string2 | La seconda stringa da confrontare. |
La funzione è binary-safe (funziona con stringhe che contengono byte null) e case-insensitive ("FILE" e "file" vengono trattati come uguali).
Valore di ritorno
strnatcasecmp() restituisce un int il cui segno indica il risultato — la grandezza esatta è definita dall'implementazione, quindi confronta sempre con 0, non con un numero specifico:
| Ritorno | Significato |
|---|---|
< 0 (negativo) | $string1 è minore di $string2 |
> 0 (positivo) | $string1 è maggiore di $string2 |
0 | Le due stringhe sono uguali |
Esempio di base
Poiché i numeri vengono confrontati per valore (1 < 10), l'output è:
file1.txt is less than file10.txtConfronto naturale vs. confronto regolare
Questo è il motivo per cui esiste strnatcasecmp(). Con un confronto regolare, le stringhe vengono confrontate un carattere alla volta, quindi '1' (la prima cifra di 10) batte '2'. L'ordine naturale considera il numero intero:
<?php
$a = "img12";
$b = "IMG2";
// Regular, case-insensitive: '1' < '2', so img12 comes first
echo strcasecmp($a, $b) . "\n"; // negative
// Natural, case-insensitive: 12 > 2, so img12 comes second
echo strnatcasecmp($a, $b) . "\n"; // positiveLe due funzioni non concordano sull'ordine e strnatcasecmp() ignora le differenze tra IMG e img, restituendo il risultato più intuitivo.
Ordinare un array in modo naturale
L'uso più comune nella pratica è come callback di confronto per usort(), per ordinare nomi di file o stringhe con versioni:
<?php
$files = ["file10.txt", "File2.txt", "file1.txt"];
usort($files, "strnatcasecmp");
print_r($files);Output:
Array
(
[0] => file1.txt
[1] => File2.txt
[2] => file10.txt
)Se hai un array che vuoi ordinare in place per valore, natcasesort() applica lo stesso ordinamento naturale e case-insensitive mantenendo le chiavi.
Funzioni correlate
| Funzione | Ordine naturale? | Case-sensitive? |
|---|---|---|
strnatcasecmp() | Sì | No |
strnatcmp() | Sì | Sì |
strcasecmp() | No | No |
strcmp() | No | Sì |
Usa strnatcasecmp() quando hai bisogno sia dell'ordinamento naturale che della case-insensitivity; scegli strnatcmp() se le maiuscole hanno importanza.
Conclusione
strnatcasecmp() confronta due stringhe nell'ordine che ci si aspetterebbe — trattando i numeri incorporati come numeri e ignorando la distinzione tra maiuscole e minuscole. Esegui sempre il confronto sul segno del suo valore di ritorno, e usala (spesso insieme a usort()) ogni volta che ordini nomi di file, etichette o qualsiasi stringa che mescola testo e numeri.