strnatcasecmp()
La fonction strnatcasecmp() en PHP compare deux chaînes sans tenir compte de la casse, en utilisant un algorithme d'ordre naturel.
Introduction
strnatcasecmp() compare deux chaînes à l'aide d'un algorithme d'"ordre naturel", en ignorant la casse. L'"ordre naturel" signifie que les nombres intégrés dans les chaînes sont comparés par leur valeur numérique plutôt que caractère par caractère — ainsi "file2" est trié avant "file10", ce qui correspond à l'ordre qu'une personne utiliserait. La comparaison alphabétique ordinaire de strcasecmp() placerait "file10" en premier, car '1' précède '2'.
Cette page présente la signature de la fonction, sa valeur de retour, ses différences avec les fonctions de comparaison associées, et son utilisation comme rappel de tri.
Syntaxe
strnatcasecmp(string $string1, string $string2): int| Paramètre | Description |
|---|---|
$string1 | La première chaîne à comparer. |
$string2 | La deuxième chaîne à comparer. |
La fonction est sécurisée binaire (elle fonctionne avec des chaînes contenant des octets nuls) et insensible à la casse ("FILE" et "file" sont considérés comme égaux).
Valeur de retour
strnatcasecmp() renvoie un int dont le signe indique le résultat — la magnitude exacte est définie par l'implémentation, donc comparez toujours à 0 et non à un nombre spécifique :
| Retour | Signification |
|---|---|
< 0 (négatif) | $string1 est inférieur à $string2 |
> 0 (positif) | $string1 est supérieur à $string2 |
0 | Les deux chaînes sont égales |
Exemple de base
Les nombres étant comparés par valeur (1 < 10), la sortie est :
file1.txt is less than file10.txtComparaison naturelle vs. comparaison ordinaire
C'est la raison d'être de strnatcasecmp(). Avec une comparaison ordinaire, les chaînes sont comparées caractère par caractère, donc '1' (le premier chiffre de 10) précède '2'. L'ordre naturel tient compte du nombre entier :
<?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"; // positiveLes deux fonctions divergent sur l'ordre et strnatcasecmp() ignore la différence de casse entre IMG et img, renvoyant le résultat intuitif pour un humain.
Trier un tableau de façon naturelle
L'utilisation la plus courante est comme rappel de comparaison pour usort(), afin de trier des noms de fichiers ou des chaînes de type version :
<?php
$files = ["file10.txt", "File2.txt", "file1.txt"];
usort($files, "strnatcasecmp");
print_r($files);Sortie :
Array
(
[0] => file1.txt
[1] => File2.txt
[2] => file10.txt
)Si vous disposez d'un tableau à trier en place par valeur, natcasesort() applique le même ordre naturel insensible à la casse tout en préservant les clés.
Fonctions associées
| Fonction | Ordre naturel ? | Sensible à la casse ? |
|---|---|---|
strnatcasecmp() | Oui | Non |
strnatcmp() | Oui | Oui |
strcasecmp() | Non | Non |
strcmp() | Non | Oui |
Utilisez strnatcasecmp() quand vous avez besoin à la fois de l'ordre naturel et de l'insensibilité à la casse ; choisissez strnatcmp() si la casse est importante.
Conclusion
strnatcasecmp() compare deux chaînes dans l'ordre qu'un humain attendrait — en traitant les nombres intégrés comme des nombres et en ignorant la casse des lettres. Basez toujours vos branchements sur le signe de la valeur de retour, et faites appel à cette fonction (souvent avec usort()) chaque fois que vous triez des noms de fichiers, des étiquettes ou des chaînes mêlant texte et nombres.