W3docs

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
ParametroDescrizione
$string1La prima stringa da confrontare.
$string2La 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:

RitornoSignificato
< 0 (negativo)$string1 è minore di $string2
> 0 (positivo)$string1 è maggiore di $string2
0Le due stringhe sono uguali

Esempio di base

php— editable, runs on the server

Poiché i numeri vengono confrontati per valore (1 < 10), l'output è:

file1.txt is less than file10.txt

Confronto 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";   // positive

Le 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

FunzioneOrdine naturale?Case-sensitive?
strnatcasecmp()No
strnatcmp()
strcasecmp()NoNo
strcmp()No

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.

Pratica

Pratica
Qual è il ruolo della funzione strnatcasecmp() in PHP?
Qual è il ruolo della funzione strnatcasecmp() in PHP?
Was this page helpful?