ksort不尊重LC_COLLATE

时间:2014-09-19 15:29:47

标签: php sorting locale

我有一个数组,哪些键是葡萄牙语的单词,我正在尝试对键进行排序而不考虑重音。

我有以下代码,但它不起作用。

    $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

1 个答案:

答案 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