我阅读了关于 sort() 和德语变音字符的各种问题,我很快就头晕目眩 - sort() 中有错误还是没有,使用区域设置解决还是没有,等等......(我是一个新手)。
对我来说,显而易见的解决方案既快捷又肮脏:将变音字符(在我的情况下以 HTML 代码的形式出现)转换为它们的正常等价物('ä' = 'ae','ö' = 'oe','ü' = 'ue','ß' = 'ss' 等),对数组进行排序,然后转换回来。但是,在某些情况下,'Mueller' 确实是 'Mueller',不需要之后转换为 'Müller'。因此,例如,我用正常等价物加上一个字符串中未使用的字符(例如 '_')来替换变音字符本身,这样只有在某些组合下才能转换回变音字符。
当然,除了 '_' 之外,任何其他字符都可以用作附加字符(影响排序结果)。我知道我的解决方案粗糙,可能会导致其他排序问题,但它足以满足我的目的。
本示例中的数组 '$dat' 填充了德国城镇名称(实际上我使用的是多维数组 ('$dat[][]'),但我将其简化为这个代码,因为它更容易理解)
<?php
$max = count($dat);
for($totcnt = 0; $totcnt < $max; $totcnt++){
$dat[$totcnt]=str_replace('ß','ss_',$dat[$totcnt]);
$dat[$totcnt]=str_replace('Ä','Ae_',$dat[$totcnt]);
$dat[$totcnt]=str_replace('ä','ae_',$dat[$totcnt]);
$dat[$totcnt]=str_replace('Ö','Oe_',$dat[$totcnt]);
$dat[$totcnt]=str_replace('ö','oe_',$dat[$totcnt]);
$dat[$totcnt]=str_replace('Ü','Ue_',$dat[$totcnt]);
$dat[$totcnt]=str_replace('ü','ue_',$dat[$totcnt]);
}
function compare_towns($a, $b)
{
return strnatcmp($a, $b);
}
usort($dat, 'compare_towns');
for($totcnt = 0; $totcnt < $max; $totcnt++){
$dat[$totcnt]=str_replace('ss_','ß',$dat[$totcnt]);
$dat[$totcnt]=str_replace('Ae_','Ä',$dat[$totcnt]);
$dat[$totcnt]=str_replace('ae_','ä',$dat[$totcnt]);
$dat[$totcnt]=str_replace('Oe_','Ö',$dat[$totcnt]);
$dat[$totcnt]=str_replace('oe_','ö',$dat[$totcnt]);
$dat[$totcnt]=str_replace('Ue_','Ü',$dat[$totcnt]);
$dat[$totcnt]=str_replace('ue_','ü',$dat[$totcnt]);
}
?>