search for in the

 Last updated: Fri, 24 Jun 2011

# strnatcmp

(PHP 4, PHP 5)

strnatcmpString comparisons using a "natural order" algorithm

### Description

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

This function implements a comparison algorithm that orders alphanumeric strings in the way a human being would, this is described as a "natural ordering". Note that this comparison is case sensitive.

### Parameters

str1

The first string.

str2

The second string.

### Return Values

Similar to other string comparison functions, this one returns < 0 if str1 is less than str2; > 0 if str1 is greater than str2, and 0 if they are equal.

### Examples

An example of the difference between this algorithm and the regular computer string sorting algorithms (used in strcmp()) can be seen below:

``` <?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);?> ```

The above example will output:

```Standard string comparison
Array
(
[0] => img1.png
[1] => img10.png
[2] => img12.png
[3] => img2.png
)

Natural order string comparison
Array
(
[0] => img1.png
[1] => img2.png
[2] => img10.png
[3] => img12.png
)
```
For more information see: Martin Pool's » Natural Order String Comparison page.

• preg_match() - Perform a regular expression match
• strcasecmp() - Binary safe case-insensitive string comparison
• substr() - Return part of a string
• stristr() - Case-insensitive strstr
• strcmp() - Binary safe string comparison
• strncmp() - Binary safe string comparison of the first n characters
• strncasecmp() - Binary safe case-insensitive string comparison of the first n characters
• strnatcasecmp() - Case insensitive string comparisons using a "natural order" algorithm
• strstr() - Find first occurrence of a string
• natsort() - آرایه را با استفاده از الگوریتم "ترتیب طبیعی" را مرتب کنید
• natcasesort() - مرتب‌سازی آرایه با استفاده از الگوریتم غیر حساس به حروف بزرگ یا کوچک مرتب کنید

User Contributed Notes strnatcmp - [2 notes]
Zero
2 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";      } } ?> ```
-1
thomas at uninet dot se
6 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. <?php function _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[1];       \$left = \$lMatch[2];     } else {       \$lTest = \$left;       \$left = '';     }     if(preg_match('/^([^0-9]*)([0-9].*)\$/Us', \$right, \$rMatch)) {       \$rTest = \$rMatch[1];       \$right = \$rMatch[2];     } 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[1]);       \$left = \$lMatch[2];     } else {       \$lTest = 0;     }     if(preg_match('/^([0-9]+)([^0-9].*)?\$/Us', \$right, \$rMatch)) {       \$rTest = intval(\$rMatch[1]);       \$right = \$rMatch[2];     } 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. ```