Сортировать массив со специальными символами в 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 ([ar] => rabe [ko] => coreano [es] => español [fr] => francés)

Тем не менее, это то, что я получаю:

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

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

4 ответа

Решение

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

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 упоминает, что

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

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

Попробуй это

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

Это не проблема!

Ваше первоначальное решение работает точно так, как ожидалось. Ваша проблема заключается в том, что функция setlocale не может установить языковой стандарт и, как следствие, asort($array, SORT_LOCALE_STRING) не удается отсортировать так, как вы ожидаете

Вы можете попробовать свой собственный код на https://phptester.net/, который принимает setlocale():

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

asort($lang,SORT_LOCALE_STRING);
echo "<pre>";
print_r($lang);
echo "</pre>";

echo "<pre>";
/*this should return es_ES; 
if returns false it has failed and asort wont return expected order
*/
var_dump(setlocale(LC_ALL,'es_ES')); 
echo "</pre>";

asort($lang,SORT_LOCALE_STRING);
echo "<pre>";
print_r($lang);
Другие вопросы по тегам