сравнение строк в локали

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

 Belgien Frankreich Italien Luxemburg Niederlande Spanien United Kingdom Österreich 

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

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

Старый вопрос, между тем я работаю в другой компании по другому проекту, но столкнулся с той же проблемой. В конечном итоге было установлено расширение 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); 

дает мне:

 массив
 (
     [0] => Ásdf
     [1] => Бельгия
     [2] => Франкрейх
     [3] => Италия
     [4] => Люксембург
     [5] => Niederlande
     [6] => Österreich
     [7] => Spanien
     [8] => Соединенное Королевство
 )

Однако это больно; он требует установки локали. locale -a дает вам установленные локали, например, на моей машине это дает мне:

 С
 en_US
 en_US.iso88591
 en_US.utf8
 POSIX
 pt_PT.utf8