2012-05-18 22 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); 

预期产出将是这个顺序:

  • 阵列([AR] => ARABE [KO] => coreano [ES] =>西班牙语[FR] =>八方资源)

然而,这是我收到什么:

  • 阵列([KO] => coreano [ES] =>西班牙语[FR] =>八方资源[AR] => ARABE)

我缺少的东西?感谢您的反馈意见! (我的服务器使用的PHP版本5.2.13)

+0

狂猜:可能是因为'c'在'á'之前? –

+0

这就是我使用SORT_LOCALE_STRING的原因。 'á'应该在'a'之后和'c'之前。 – andufo

+0

好吧,祝你好运:) –

回答

5

尝试通过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'); 

要:

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)上运行它,它对我来说工作正常。如果是这种情况,你应该看到Jon的评论,并检查你的文件是如何编码的。 –

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