2012-05-18 4 views
7

У меня есть массив, который содержит имена языков на испанском языке:Отсортировать массив со специальными символами в 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); 

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

  • Array ([ар] => ARABE [ко] => Coreano [исп] => español [фр] => Francés)

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

  • Array ([ко] => Coreano [исп] => español [фр] => Francés [ар] => ARABE)

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

+0

Дикая догадка: возможно, потому что 'c' доходит до' ''? –

+0

Вот почему я использую SORT_LOCALE_STRING. '' должен прийти после 'a' и до 'c'. – andufo

+0

ОК, удачи :) –

ответ

5

Try сортировать по translitterated именами:

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); 
+0

Это сработало. Благодаря! – andufo

+3

Это может работать для этого конкретного случая, но это не надежное общее решение; что произойдет, если вы хотите отсортировать массив, содержащий, например, строки кириллических или греческих букв?Транслитерация ASCII не особенно надежна. –

+0

@WillVousden Вы правы. В любом случае, для массива, содержащего имена языков, все в порядке, я думаю. –

2

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

Изменение:

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

To:

setlocale(LC_ALL,'es_ES'); 

Выход:

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

Я тоже пробовал это, но он возвращает тот же ответ: Array ([ko] => coreano [es] => español [fr] => francés [ar] => árabe) – andufo

+1

Этот языковой стандарт 100% правильный, если файл кодируется в UTF-8. В любом случае, суффикс языка и кодировка файла должны совпадать. – Jon

+0

@andufo Попробуйте запустить его на [phptester.net] (http://phptester.net/index.php?lang=en), он отлично работает для меня. Если это так, вы должны увидеть комментарий Джона и проверить, как ваш файл закодирован. –

0

Попробуйте

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

извините, не работает :( – andufo

0

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

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

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

+0

не работает :(мой сервер разработки работает на Mac с OSX. – andufo

Смежные вопросы