PHPKonf 2020 Online

# strnatcmp

(PHP 4, PHP 5, PHP 7)

strnatcmpComparaison de chaînes avec l'algorithme d'"ordre naturel"

### Description

strnatcmp ( string `\$str1` , string `\$str2` ) : int

Implémente l'algorithme de comparaison qui ordonne les chaînes tel qu'un homme le ferait. Notez que cette comparaison est sensible à la casse.

### Liste de paramètres

`str1`

La première chaîne.

`str2`

La seconde chaîne.

### Valeurs de retour

De la même façon que les autres fonctions comparant deux chaînes, la fonction retourne < 0 si `str1` est inférieure à `str2`; > 0 si `str1` est supérieure à `str2`, et 0 si les deux chaînes sont égales.

### Exemples

Un exemple de la différence de traitement avec l'algorithme standard est présenté ci-dessous :

``` <?php\$arr1 = \$arr2 = array("img12.png", "img10.png", "img2.png", "img1.png");echo "Tri de chaînes standard\n";usort(\$arr1, "strcmp");print_r(\$arr1);echo "\nTri de chaînes \"ordre naturel\"\n";usort(\$arr2, "strnatcmp");print_r(\$arr2);?> ```

L'exemple ci-dessus va afficher :

```Tri de chaînes standard
Array
(
 => img1.png
 => img10.png
 => img12.png
 => img2.png
)

Tri de chaînes "ordre naturel"
Array
(
 => img1.png
 => img2.png
 => img10.png
 => img12.png
)
```
Pour plus de détails, reportez-vous à » ```Natural Order String Comparison``` de Martin Pool (en anglais).

### Voir aussi

• preg_match() - Effectue une recherche de correspondance avec une expression rationnelle standard
• strcasecmp() - Comparaison insensible à la casse de chaînes binaires
• substr() - Retourne un segment de chaîne
• stristr() - Version insensible à la casse de strstr
• strcmp() - Comparaison binaire de chaînes
• strncmp() - Comparaison binaire des n premiers caractères
• strncasecmp() - Compare en binaire des chaînes de caractères
• strnatcasecmp() - Comparaison de chaînes avec l'algorithme d'"ordre naturel" (insensible à la casse)
• strstr() - Trouve la première occurrence dans une chaîne
• natsort() - Trie un tableau avec l'algorithme à "ordre naturel"
• natcasesort() - Trie un tableau avec l'algorithme à "ordre naturel" insensible à la casse add a note

### User Contributed Notes 5 notes

in dot games dot mq at gmail dot com
3 years ago
``` Can also be used with combination of a compare for an array nested value, like<?php\$array = array(    "city" => "xyz",    "names" => array(        array(            "name" => "Ana2",            "id" => 1        ) ,        array(            "name" => "Ana1",            "id" => 2        )    ));usort(\$array["names"], function (\$a, \$b)    {    return strnatcmp(\$a['name'], \$b['name']);} ); ```
thomas at uninet dot se
14 years ago
``` There seems to be a bug in the localization for strnatcmp and strnatcasecmp. I searched the reported bugs and found a few entries which were up to four years old (but the problem still exists when using swedish characters).These functions might work instead.<?phpfunction _strnatcasecmp(\$left, \$right) {  return _strnatcmp(strtolower(\$left), strtolower(\$right));}function _strnatcmp(\$left, \$right) {  while((strlen(\$left) > 0) && (strlen(\$right) > 0)) {    if(preg_match('/^([^0-9]*)([0-9].*)\$/Us', \$left, \$lMatch)) {      \$lTest = \$lMatch;      \$left = \$lMatch;    } else {      \$lTest = \$left;      \$left = '';    }    if(preg_match('/^([^0-9]*)([0-9].*)\$/Us', \$right, \$rMatch)) {      \$rTest = \$rMatch;      \$right = \$rMatch;    } else {      \$rTest = \$right;      \$right = '';    }    \$test = strcmp(\$lTest, \$rTest);    if(\$test != 0) {      return \$test;    }    if(preg_match('/^([0-9]+)([^0-9].*)?\$/Us', \$left, \$lMatch)) {      \$lTest = intval(\$lMatch);      \$left = \$lMatch;    } else {      \$lTest = 0;    }    if(preg_match('/^([0-9]+)([^0-9].*)?\$/Us', \$right, \$rMatch)) {      \$rTest = intval(\$rMatch);      \$right = \$rMatch;    } else {      \$rTest = 0;    }    \$test = \$lTest - \$rTest;    if(\$test != 0) {      return \$test;    }  }  return strcmp(\$left, \$right);}?>The code is not optimized. It was just made to solve my problem. ```
-2
spamspamspam at gmx dot com
2 years ago
``` Some more remarkable outcomes:var_dump(strnatcmp("0.15m", "0.2m"));int(1)var_dump(strnatcmp("0.15m", "0.20m"));int(-1)It's not about localisation:var_dump(strnatcmp("0,15m", "0,2m"));int(1)var_dump(strnatcmp("0,15m", "0,20m"));int(-1) ```
-1
chris at ocproducts dot com
3 years ago
``` This function has some interesting behaviour on strings consisting of mixed numbers and letters.One may expect that such a mixed string would be treated as alpha-numeric, but that is not true.var_dump(strnatcmp('23','123')); →int(-1)As expected, 23<123   (even though first digit is higher, overall number is smaller)var_dump(strnatcmp('yz','xyz')); →int(1)As expected, yz>xyz   (string comparison, irregardless of string length)var_dump(strnatcmp('2x','12y')); →int(-1)Remarkable, 2x<12y    (does a numeric comparison)var_dump(strnatcmp('20x','12y'));int(1)Remarkable, 20x>12y    (does a numeric comparison)It seems to be splitting what is being compared into runs of numbers and letters, and then comparing each run in isolation, until it has an ordering difference. ```
-58
Zero
9 years ago
``` If you want to compare \$_SESSION variables to a string use this <?php if(isset(\$_SESSION['usertype'])) {         echo "usertype " .\$_SESSION['usertype'];                      \$ut = \$_SESSION['usertype'];                      if(strnatcmp(\$ut,"admin"))      {           echo "hello admin";      } } ?> ``` 