сравнение строк с учетом локали
Я использую strcmp
в сочетании с usort
для сортировки массива названий стран. В настоящее время порядок сортировки таков:
Belgien
Frankreich
Italien
Luxemburg
Niederlande
Spanien
United Kingdom
Österreich
, что правильно, кроме позиции Österreich
. Это должно быть между Niederlande
и Spanien
.
Я также пробовал strnatcmp
и strcoll
(с setlocale
), но порядок сортировки был не таким, как я хотел. Результаты получены не из базы данных mysql, поэтому сортировка с помощью запроса mysql не является опцией.
2 answers
Старый вопрос, тем временем я работаю в другой компании над другим проектом, но недавно столкнулся с той же проблемой. Что, наконец, сработало, так это установка расширения intl для PHP.
sudo apt-get install php5-intl
, А затем с помощью:
$arr = array(
"Belgien",
"Frankreich",
"Italien",
"Luxemburg",
"Niederlande",
"United Kingdom",
"Österreich",
"Spanien",
"Ásdf",
);
$coll = collator_create('de_DE');
$coll->sort($arr);
print_r($arr);
Вернул результаты в ожидаемом порядке:
Array
(
[0] => Ásdf
[1] => Belgien
[2] => Frankreich
[3] => Italien
[4] => Luxemburg
[5] => Niederlande
[6] => Österreich
[7] => Spanien
[8] => United Kingdom
)
Это работает (предполагается, что скрипт находится в UTF-8):
<?php
$arr = array(
"Belgien",
"Frankreich",
"Italien",
"Luxemburg",
"Niederlande",
"United Kingdom",
"Österreich",
"Spanien",
"Ásdf",
);
setlocale(LC_COLLATE, "pt_PT.UTF8");
usort($arr, 'strcoll');
print_r($arr);
Дает мне:
Array ( [0] => Ásdf [1] => Belgien [2] => Frankreich [3] => Italien [4] => Luxemburg [5] => Niederlande [6] => Österreich [7] => Spanien [8] => United Kingdom )
Однако это болезненно; для этого требуется установить языковой стандарт. locale -a
предоставляет вам установленные локали, например, на моей машине это дает мне:
C en_US en_US.iso88591 en_US.utf8 POSIX pt_PT.utf8