用特殊字符排序
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”等字符串不一致的结果
[这些是说英语的人永远不会遇到的问题]
我有一个函数可以对值列表进行排序。
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”等字符串不一致的结果
[这些是说英语的人永远不会遇到的问题]