# strnatcmp

(PHP 4, PHP 5, PHP 7)

strnatcmpComparación de strings utilizando un algoritmo de "orden natural"

### Descripción

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

Esta función implementa un algoritmo de comparación que ordena strings alfanuméricos de la manera en que un humano lo haría, lo cual se describe como "orden natural". Tener en cuenta que esta comparación es sensible a mayúsculas y minúsculas.

### Parámetros

`str1`

El primer string.

`str2`

El segundo string.

### Valores devueltos

De forma similar a otras funciones de comparación, esta devuelve < 0 si `str1` es menor que `str2`; > 0 si `str1` es mayor que `str2` y 0 si son iguales.

### Ejemplos

Un ejemplo de la diferencia entre éste algoritmo y los algoritmos normales de clasificación del computador (usados en strcmp()), se puede ver a continuación

``` <?php\$arr1 = \$arr2 = array("img12.png", "img10.png", "img2.png", "img1.png");echo "Standard string comparison\n";usort(\$arr1, "strcmp");print_r(\$arr1);echo "\nNatural order string comparison\n";usort(\$arr2, "strnatcmp");print_r(\$arr2);?> ```

```Standard string comparison
Array
(
 => img1.png
 => img10.png
 => img12.png
 => img2.png
)

Natural order string comparison
Array
(
 => img1.png
 => img2.png
 => img10.png
 => img12.png
)
```
Para más información ver la página de Martin Pool: » Natural Order String Comparison.

### Ver también

• preg_match() - Realiza una comparación con una expresión regular
• strcasecmp() - Comparación de string segura a nivel binario e insensible a mayúsculas y minúsculas
• substr() - Devuelve parte de una cadena
• stristr() - strstr insensible a mayúsculas y minúsculas
• strcmp() - Comparación de string segura a nivel binario
• strncmp() - Comparación segura a nivel binario de los primeros n caracteres entre strings
• strncasecmp() - Comparación de los primeros n caracteres de cadenas, segura con material binario e insensible a mayúsculas y minúsculas
• strnatcasecmp() - Comparación de strings, insensible a mayúsculas y minúsculas, utilizando un algoritmo de "orden natural"
• strstr() - Encuentra la primera aparición de un string
• natsort() - Ordena un array usando un algoritmo de "orden natural"
• natcasesort() - Ordenar un array usando un algoritmo de "orden natural" insensible a mayúsculas-minúsculas add a note

### User Contributed Notes 5 notes

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. ```
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. ```
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']);} ); ```
spamspamspam at gmx dot com
1 year 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) ```
-54
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";      } } ?> ``` 