W3docs

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Строки равны

Базовый пример

php— editable, runs on the server

Поскольку числа сравниваются по значению (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()) при сортировке имён файлов, меток или любых строк, в которых чередуются текст и числа.

Практика

Практика
Какова роль функции strnatcasecmp() в PHP?
Какова роль функции strnatcasecmp() в PHP?
Was this page helpful?