我有一个数组,哪些键是葡萄牙语的单词,我正在尝试对键进行排序而不考虑重音。
我有以下代码,但它不起作用。
$array = array('ábaco' => 1,
'aéreo' => 2,
'abecedário' => 3,
'andar' => 4,
'absurdo' => 5);
$locale = ( defined('PHP_OS') &&
stristr(PHP_OS, 'win') &&
!stristr(PHP_OS, 'darwin')) ? 'Portuguese_Brazil.1252' : 'pt_BR.UTF-8';
setlocale(LC_COLLATE, $locale);
var_dump($locale);
ksort($array, SORT_LOCALE_STRING);
var_dump($array);
结果如下:
string 'pt_BR.UTF-8' (length=11)
array (size=5)
'abecedário' => int 3
'absurdo' => int 5
'andar' => int 4
'aéreo' => int 2
'ábaco' => int 1
例如,'ábaco'这个词应该是第一个,但它是最后一个因为它的第一个字母“á”。
我在使用PHP 5.4的Mac上运行此脚本。
此问题似乎与此问题中描述的问题不同:PHP ksort seems unaffected by setlocale
答案 0 :(得分:2)
在尝试了一些选项后,我没有设法让ksort尊重整理。
我结束了使用uksort并制作了自己的比较功能,如下所示。
function stripAccents($str) {
return strtr(
utf8_decode($str),
utf8_decode('àáâãäçèéêëìíîïñòóôõöùúûüýÿÀÁÂÃÄÇÈÉÊËÌÍÎÏÑÒÓÔÕÖÙÚÛÜÝ'),
'aaaaaceeeeiiiinooooouuuuyyAAAAACEEEEIIIINOOOOOUUUUY');
}
function compareWords($w1, $w2){
return strcasecmp(stripAccents($w1), stripAccents($w2));
}
uksort($array, "compareWords");
stripAccents函数借用了这个答案:https://stackoverflow.com/a/11743977/726142