Classifique um array com caracteres especiais em PHP
Pergunta
Eu tenho um array que contém os nomes dos idiomas em espanhol:
$lang["ko"] = "coreano"; //korean
$lang["ar"] = "árabe"; //arabic
$lang["es"] = "español"; //spanish
$lang["fr"] = "francés"; //french
Preciso ordenar o array e manter a associação do índice, então uso um tipo() com o 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);
A saída esperada seria nesta ordem:
- Array ( [ar] => árabe [ko] => coreano [es] => español [fr] => francés )
No entanto, é isso que estou recebendo:
- Array ( [ko] => coreano [es] => español [fr] => francés [ar] => árabe )
Estou esquecendo de algo?Obrigado pelo seu feedback!(meu servidor está usando PHP versão 5.2.13)
Solução
Tente classificar por nomes transliterados:
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);
Outras dicas
Você definiu sua localidade incorretamente em setlocale()
.
Mudar:
setlocale(LC_ALL,'es_ES.UTF-8');
Para:
setlocale(LC_ALL,'es_ES');
Saída:
Array ( [ar] => árabe [ko] => coreano [es] => español [fr] => francés )
A documentação para setlocale
menciona que
Sistemas diferentes possuem esquemas de nomenclatura diferentes para localidades.
É possível que o seu sistema não reconheça a localidade como es_ES
.Se você estiver no Windows, tente esp_ESP
em vez de.
Experimente isso
setlocale(LC_COLLATE, 'nl_BE.utf8');
$array = array('coreano','árabe','español','francés');
usort($array, 'strcoll');
print_r($array);