用特殊字符排序

Sorting with special characters

我有一个函数可以对值列表进行排序。

 function build_sorter($key) {
    return function ($a, $b) use ($key) {
        return strnatcmp($a[$key], $b[$key]);
    };
 }

效果很好,但它无法对带有变音符号的特殊字符(ÁÉÍÓŮňďť 等)进行排序。这些列在列表的末尾,即使它们属于更高级别(正确排序如 AÁEÉnň 等,但排序使其成为 AEnÁÉň)。

有人知道如何实现吗?

我不知道这是否适合你,但我通常做的是将字符串转换为 ASCII,因此它将对你的字符进行排序,就好像它们是 "regular" 人声一样。

function build_sorter($key) {
   return function ($a, $b) use ($key) {
       $stra = iconv('utf8', 'US-ASCII//TRANSLIT', $a[$key]);
       $strb = iconv('utf8', 'US-ASCII//TRANSLIT', $b[$key]);
       return strnatcmp($stra, $strb);
   };
}

由于我们音译为 ASCII,您将获得“Á”的等效 "A",因此您的分拣器现在应该可以正常工作。

  • 记得将 utf-8 设置为您选择的编码。我只是假设它是UTF。
  • 您的原始字符串不受影响。
  • 排序可能会返回与 "alter" 和“älter”等字符串不一致的结果

[这些是说英语的人永远不会遇到的问题]