strnatcasecmp()
Функция strnatcasecmp() в PHP сравнивает две строки без учёта регистра, используя алгоритм "естественного порядка", аналогично strcasecmp().
Введение
strnatcasecmp() сравнивает две строки с помощью алгоритма "естественного порядка", игнорируя регистр. "Естественный порядок" означает, что числа, встроенные в строки, сравниваются по числовому значению, а не посимвольно — то есть "file2" будет стоять перед "file10", как это сделал бы человек. Обычное алфавитное сравнение, используемое strcasecmp(), напротив, поставит "file10" первым, потому что символ '1' стоит перед '2'.
На этой странице описывается сигнатура функции, её возвращаемое значение, отличия от связанных функций сравнения, а также способы использования в качестве колбэка сортировки.
Синтаксис
strnatcasecmp(string $string1, string $string2): int| Параметр | Описание |
|---|---|
$string1 | Первая строка для сравнения. |
$string2 | Вторая строка для сравнения. |
Функция является бинарно-безопасной (работает со строками, содержащими нулевые байты) и регистронезависимой ("FILE" и "file" считаются равными).
Возвращаемое значение
strnatcasecmp() возвращает значение типа int, знак которого указывает на результат — точная величина зависит от реализации, поэтому всегда сравнивайте с 0, а не с конкретным числом:
| Возвращаемое значение | Смысл |
|---|---|
< 0 (отрицательное) | $string1 меньше $string2 |
> 0 (положительное) | $string1 больше $string2 |
0 | Строки равны |
Базовый пример
Поскольку числа сравниваются по значению (1 < 10), вывод будет следующим:
file1.txt is less than file10.txtЕстественное и обычное сравнение
Именно для этого и существует strnatcasecmp(). При обычном сравнении строки сравниваются посимвольно, поэтому '1' (первая цифра числа 10) считается больше '2'. Естественный порядок смотрит на число целиком:
<?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Две функции дают разный порядок, и при этом strnatcasecmp() игнорирует разницу в регистре между IMG и img, возвращая результат, понятный человеку.
Сортировка массива в естественном порядке
Наиболее распространённое практическое применение — в качестве колбэка сравнения для usort(), чтобы сортировать имена файлов или строки, похожие на версии:
<?php
$files = ["file10.txt", "File2.txt", "file1.txt"];
usort($files, "strnatcasecmp");
print_r($files);Вывод:
Array
(
[0] => file1.txt
[1] => File2.txt
[2] => file10.txt
)Если нужно отсортировать массив на месте по значению, natcasesort() применяет тот же естественный регистронезависимый порядок, сохраняя ключи.
Связанные функции
| Функция | Естественный порядок? | Учёт регистра? |
|---|---|---|
strnatcasecmp() | Да | Нет |
strnatcmp() | Да | Да |
strcasecmp() | Нет | Нет |
strcmp() | Нет | Да |
Используйте strnatcasecmp(), когда нужен одновременно естественный порядок и нечувствительность к регистру; выбирайте strnatcmp(), если регистр важен.
Заключение
strnatcasecmp() сравнивает две строки в том порядке, который ожидает человек — рассматривая встроенные числа как числа и игнорируя регистр букв. Всегда ветвитесь по знаку возвращаемого значения и используйте эту функцию (часто вместе с usort()) при сортировке имён файлов, меток или любых строк, в которых чередуются текст и числа.