natsort 和 strnatcasecmp 与西里尔文不同
natsort and strnatcasecmp work different with cyrillic
strnatcasecmp 与西里尔字母一起工作时非常奇怪。见代码:
//must be exact in this order
$s1 = 'Журнал 1';
$s2 = 'Каротаж';
$arr[] = $s1;
$arr[] = $s2;
natsort($arr);
//worked fine
var_dump($arr);
var_dump(strnatcasecmp($s1, $s2));
//returns 1 although must return -1!
是的,这可能是问题所在,因为此函数是二进制不安全的。你可以试试 strncasecmp
吗?
也看看这里 - Sort an array with special characters in PHP,也许你会找到一些能给你带来一些解决方案的东西。
最终,我是这样解决问题的:
function strnatcasecmp_cyr($s1, $s2)
{
if ($s1 === $s2) {
return 0;
}
$arr[] = $s1;
$arr[] = $s2;
natsort($arr);
if (current($arr) === $s1) {
return -1;
} else {
return 1;
}
}
虽然丑陋,但确实有效。期待更好的解决方案。
strnatcasecmp 与西里尔字母一起工作时非常奇怪。见代码:
//must be exact in this order
$s1 = 'Журнал 1';
$s2 = 'Каротаж';
$arr[] = $s1;
$arr[] = $s2;
natsort($arr);
//worked fine
var_dump($arr);
var_dump(strnatcasecmp($s1, $s2));
//returns 1 although must return -1!
是的,这可能是问题所在,因为此函数是二进制不安全的。你可以试试 strncasecmp
吗?
也看看这里 - Sort an array with special characters in PHP,也许你会找到一些能给你带来一些解决方案的东西。
最终,我是这样解决问题的:
function strnatcasecmp_cyr($s1, $s2)
{
if ($s1 === $s2) {
return 0;
}
$arr[] = $s1;
$arr[] = $s2;
natsort($arr);
if (current($arr) === $s1) {
return -1;
} else {
return 1;
}
}
虽然丑陋,但确实有效。期待更好的解决方案。