Strcoll: примеры (PHP)
strcoll(string string1, string string2): intФункция strcoll в PHP предназначена для сравнения двух строк с учетом региональных настроек (локали). Она используется в случаях, когда требуется корректное сравнение строк с учетом особенностей языка, например, при сортировке текстовых данных на различных языках.
Функция возвращает целое число: меньше 0, если первая строка меньше второй; больше 0, если первая строка больше второй; и 0, если строки равны.
int strcoll ( string $string1 , string $string2 )
- $string1 – первая сравниваемая строка.
- $string2 – вторая сравниваемая строка.
Для корректной работы функции необходимо предварительно установить локаль с помощью setlocale().
setlocale(LC_COLLATE, 'C');
$result = strcoll('apple', 'banana');
echo $result;-1
Результат отрицательный, так как 'apple' идет перед 'banana' в лексикографическом порядке при локали C.
setlocale(LC_COLLATE, 'ru_RU.UTF-8');
$result = strcoll('яблоко', 'банан');
echo $result;1
При русской локали 'яблоко' идет после 'банана', поэтому результат положительный.
setlocale(LC_COLLATE, 'en_US.UTF-8');
$result = strcoll('Hello', 'Hello');
echo $result;0
- strcmp() – бинарно-безопасное сравнение строк без учета локали. Используется для точного сравнения, когда важны байтовые значения.
- strcasecmp() – сравнение строк без учета регистра, также без учета локали.
- strnatcmp() – естественное сравнение строк (например, 'img2' перед 'img10').
- strcoll() предпочтительнее при работе с мультиязычными приложениями, где требуется учет правил сортировки конкретного языка.
$result = strcoll('ä', 'a');
echo $result;Результат может быть некорректным, так как локаль по умолчанию (C) не учитывает специальные символы.
$result = strcoll(123, '123');
echo $result;0
Функция преобразует числа в строки, но такое использование может привести к неожиданным результатам.
В PHP 8 значительных изменений в работе функции strcoll не произошло. Функция сохранила обратную совместимость. Однако, в PHP 8 улучшена обработка локалей в некоторых системах, что может повлиять на результаты сравнения в определенных средах.
setlocale(LC_COLLATE, 'ru_RU.UTF-8');
$fruits = array('яблоко', 'апельсин', 'банан');
usort($fruits, 'strcoll');
print_r($fruits);Array
(
[0] => апельсин
[1] => банан
[2] => яблоко
)setlocale(LC_COLLATE, 'de_DE.UTF-8');
$result1 = strcoll('ä', 'a');
setlocale(LC_COLLATE, 'C');
$result2 = strcoll('ä', 'a');
echo "de_DE: $result1, C: $result2";de_DE: 1, C: 1
В немецкой локали 'ä' может рассматриваться как отдельная буква, идущая после 'a', а в локали C сравнение происходит по ASCII-кодам.
setlocale(LC_COLLATE, 'fr_FR.UTF-8');
$words = array('côte', 'coté', 'cote');
usort($words, function($a, $b) {
return strcoll($a, $b);
});
print_r($words);Array
(
[0] => cote
[1] => coté
[2] => côte
)import locale
locale.setlocale(locale.LC_COLLATE, 'ru_RU.UTF-8')
result = locale.strcoll('яблоко', 'банан')
print(result)1
let result = 'яблоко'.localeCompare('банан', 'ru');
console.log(result);1
SELECT 'яблоко' COLLATE utf8mb4_unicode_ci > 'банан';1
Все аналоги учитывают локаль, но синтаксис и способы установки локали различаются.