сравнение строк с учетом локали


Я использую strcmp в сочетании с usort для сортировки массива названий стран. В настоящее время порядок сортировки таков:

Belgien
Frankreich
Italien
Luxemburg
Niederlande
Spanien
United Kingdom
Österreich

, что правильно, кроме позиции Österreich. Это должно быть между Niederlande и Spanien.

Я также пробовал strnatcmp и strcollsetlocale), но порядок сортировки был не таким, как я хотел. Результаты получены не из базы данных mysql, поэтому сортировка с помощью запроса mysql не является опцией.

Author: Max, 2010-07-08

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
)
 5
Author: Max, 2011-05-22 14:45:08

Это работает (предполагается, что скрипт находится в 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
 0
Author: Artefacto, 2010-07-08 13:55:52