sort()为日语

hao*_*hao 10 php unicode localization collation cjk

如果我将当前的语言环境设置为日语,我该如何设置它以使日语字符始终具有比非日语字符更高的优先级.例如,现在英文字符将始终出现在片假名字符之前.我该如何扭转这种影响呢?

很抱歉不太清楚.正如你在这里看到的那样.

最终结果有Java,NVIDIA和Windowsファイアウォール.排在日本人物之前的前三名.是否有可能在最后?

Wh1*_*Ck5 6

使用usort()而不是sort(),以便您可以按自己的方式定义比较条件.

试试这个简单的方法.我从这里尝试了它的例子,它的工作原理.

  function mccompare($a, $b) {
    $fca = ord(substr($a, 0, 1)); $fcb = ord(substr($b, 0, 1));
    if (($fca >= 127 && $fcb >= 127) || ($fca < 127 && $fcb < 127))
      $res = $a > $b ? 1 : -1; 
    else 
      $res = $a > $b ? -1 : 1;
    return $res;
    }

  usort ($your_array, "mccompare");
Run Code Online (Sandbox Code Playgroud)

所以对于这个例子

  setlocale(LC_COLLATE, "jpn");

  $your_array = array ("????", "??", "Windows ???????",
      "??????? ?????",  "?????", "???", "????", "?????",
      "????", "?????", "???", "???????????", "????",
      "???????", "???", "??????????", "????????????",
      "Java", "NVIDIA");

  usort ($your_array, "mccompare");
  print_r($your_array);
Run Code Online (Sandbox Code Playgroud)

它返回数组

Array
(
    [0] => ??????? ?????
    [1] => ?????
    [2] => ????
    [3] => ???
    [4] => ????
    [5] => ???????????
    [6] => ???
    [7] => ???
    [8] => ??????????
    [9] => ?????
    [10] => ??
    [11] => ?????
    [12] => ????
    [13] => ???????
    [14] => ????????????
    [15] => ????
    [16] => Java
    [17] => NVIDIA
    [18] => Windows ???????
)
Run Code Online (Sandbox Code Playgroud)

注意:这只是我对这个问题的快速解决方案,并不是一个完美的解决方案.它基于检查比较字符串中的第一个字节,但您总是可以在其中进行一些努力并改进此功能以检查所有多字节字符与Unicode,然后确定$ a <= $ b或$ a> $ b.

希望这对你有用!