在PHP中使用特殊字符对数组进行排序

时间:2012-05-18 08:48:49

标签: php setlocale asort

我有一个数组,其中包含西班牙语的语言名称:

$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版)

5 个答案:

答案 0 :(得分:9)

尝试按透明名称排序:

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

答案 1 :(得分:1)

您在setlocale()

中错误地定义了您的语言区域

变化:

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

要:

setlocale(LC_ALL,'es_ES');

输出:

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

答案 2 :(得分:1)

setlocale的文档提及

  

不同的系统对语言环境有不同的命名方案。

您的系统可能无法将区域设置识别为es_ES。如果您使用的是Windows,请尝试使用esp_ESP

答案 3 :(得分:0)

试试这个

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

答案 4 :(得分:0)

这是没有问题的!

您的初始解决方案可以按预期工作, 您的问题是setlocale函数无法设置区域设置,因此asort($array, SORT_LOCALE_STRING)无法按您期望的那样排序

您可以在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);