Сортировка массива со специальными символами в PHP

У меня есть массив, содержащий имена языков на испанском языке:

$lang["ko"] = "coreano"; //korean $lang["ar"] = "árabe"; //arabic $lang["es"] = "español"; //spanish $lang["fr"] = "francés"; //french 

Мне нужно заказать массив и поддерживать ассоциацию индексов, поэтому я использую asort () с SORT_LOCALE_STRING

 setlocale(LC_ALL,'es_ES.UTF-8'); //this is at the beginning (config file) asort($lang,SORT_LOCALE_STRING); print_r($lang); 

Ожидаемый результат будет в следующем порядке:

  • Массив ([ar] => árabe [ko] => coreano [es] => español [fr] => francés)

Однако это то, что я получаю:

  • Массив ([ko] => coreano [es] => español [fr] => francés [ar] => árabe)

Я что-то упускаю? Спасибо за ваш отзыв! (мой сервер использует PHP версии 5.2.13)

Попробуйте отсортировать по транслитерированным именам:

 function compareASCII($a, $b) { $at = iconv('UTF-8', 'ASCII//TRANSLIT', $a); $bt = iconv('UTF-8', 'ASCII//TRANSLIT', $b); return strcmp($at, $bt); } uasort($lang, 'compareASCII'); print_r($lang); 

Вы неправильно определили свой язык в setlocale() .

Изменить:

 setlocale(LC_ALL,'es_ES.UTF-8'); 

Для того, чтобы:

 setlocale(LC_ALL,'es_ES'); 

Вывод:

 Array ( [ar] => árabe [ko] => coreano [es] => español [fr] => francés ) 

Попробуй это

 setlocale(LC_COLLATE, 'nl_BE.utf8'); $array = array('coreano','árabe','español','francés'); usort($array, 'strcoll'); print_r($array); 

В документации для setlocale упоминается, что

Различные системы имеют разные схемы именования для локалей.

Возможно, ваша система не распознает локаль как es_ES . Если вы находитесь в Windows, попробуйте esp_ESP .