Сортировать массив со специальными символами в 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);