1

Strcoll: примеры (PHP)

Сравнение строк с учетом локали: работа с strcoll в PHP
Раздел: Работа со строками
strcoll(string string1, string string2): int
Описание функции strcoll

Функция strcoll в PHP предназначена для сравнения двух строк с учетом региональных настроек (локали). Она используется в случаях, когда требуется корректное сравнение строк с учетом особенностей языка, например, при сортировке текстовых данных на различных языках.

Функция возвращает целое число: меньше 0, если первая строка меньше второй; больше 0, если первая строка больше второй; и 0, если строки равны.

Синтаксис и аргументы
int strcoll ( string $string1 , string $string2 )
  • $string1 – первая сравниваемая строка.
  • $string2 – вторая сравниваемая строка.

Для корректной работы функции необходимо предварительно установить локаль с помощью setlocale().

Краткие примеры использования
Пример 1: Сравнение строк с локалью C
setlocale(LC_COLLATE, 'C');
$result = strcoll('apple', 'banana');
echo $result;
-1

Результат отрицательный, так как 'apple' идет перед 'banana' в лексикографическом порядке при локали C.

Пример 2: Сравнение строк с локалью ru_RU
setlocale(LC_COLLATE, 'ru_RU.UTF-8');
$result = strcoll('яблоко', 'банан');
echo $result;
1

При русской локали 'яблоко' идет после 'банана', поэтому результат положительный.

Пример 3: Сравнение одинаковых строк
setlocale(LC_COLLATE, 'en_US.UTF-8');
$result = strcoll('Hello', 'Hello');
echo $result;
0
Похожие функции в PHP
  • strcmp() – бинарно-безопасное сравнение строк без учета локали. Используется для точного сравнения, когда важны байтовые значения.
  • strcasecmp() – сравнение строк без учета регистра, также без учета локали.
  • strnatcmp() – естественное сравнение строк (например, 'img2' перед 'img10').
  • strcoll() предпочтительнее при работе с мультиязычными приложениями, где требуется учет правил сортировки конкретного языка.
Типичные ошибки
Ошибка 1: Не установлена локаль
$result = strcoll('ä', 'a');
echo $result;
Результат может быть некорректным, так как локаль по умолчанию (C) не учитывает специальные символы.
Ошибка 2: Использование с нестроковыми аргументами
$result = strcoll(123, '123');
echo $result;
0

Функция преобразует числа в строки, но такое использование может привести к неожиданным результатам.

Изменения в PHP 8

В PHP 8 значительных изменений в работе функции strcoll не произошло. Функция сохранила обратную совместимость. Однако, в PHP 8 улучшена обработка локалей в некоторых системах, что может повлиять на результаты сравнения в определенных средах.

Расширенные примеры
Пример 1: Сортировка массива с учетом локали
Пример php
setlocale(LC_COLLATE, 'ru_RU.UTF-8');
$fruits = array('яблоко', 'апельсин', 'банан');
usort($fruits, 'strcoll');
print_r($fruits);
Array
(
    [0] => апельсин
    [1] => банан
    [2] => яблоко
)
Пример 2: Сравнение с учетом разных локалей
Пример php
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-кодам.

Пример 3: Использование с пользовательской функцией сортировки
Пример php
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
)
Аналоги в других языках
Python: locale.strcoll()
import locale
locale.setlocale(locale.LC_COLLATE, 'ru_RU.UTF-8')
result = locale.strcoll('яблоко', 'банан')
print(result)
1
JavaScript: localeCompare()
let result = 'яблоко'.localeCompare('банан', 'ru');
console.log(result);
1
MySQL: COLLATE оператор
SELECT 'яблоко' COLLATE utf8mb4_unicode_ci > 'банан';
1

Все аналоги учитывают локаль, но синтаксис и способы установки локали различаются.

PHP strcoll function comments

En
Strcoll Locale based string comparison