Php 俄语/英语列表排序
我有以下数组,其中包含英语和俄语单词:Php 俄语/英语列表排序,php,sorting,cyrillic,Php,Sorting,Cyrillic,我有以下数组,其中包含英语和俄语单词: [0] => Airline_1 [1] => Second Air [2] => Авиатор [3] => Аврора 我使用以下函数对其进行排序: uasort($newCompanyList, function ($a, $b) { $at = iconv('UTF-8', 'ASCII//TRANSLIT', $a); $bt = iconv('UTF-8', 'ASC
[0] => Airline_1
[1] => Second Air
[2] => Авиатор
[3] => Аврора
我使用以下函数对其进行排序:
uasort($newCompanyList, function ($a, $b) {
$at = iconv('UTF-8', 'ASCII//TRANSLIT', $a);
$bt = iconv('UTF-8', 'ASCII//TRANSLIT', $b);
return strcmp($at, $bt);
});
预期结果如下:
[0] => Airline_1
[2] => Авиатор
[3] => Аврора
[1] => Second Air
问题是它确实会对列表进行排序,但它会将它们分开进行排序,如果有意义的话,我需要将俄语的“A”放在英语的“A”旁边。我如何才能做到这一点?您可以使用Intl扩展名和音译对象,如下所示:
$transliterator = Transliterator::create('Any-Latin; Latin-ASCII;');
uasort($newCompanyList, function ($a, $b) use ($transliterator) {
$at = $transliterator->transliterate($a);
$bt = $transliterator->transliterate($b);
return strcmp($at.$a, $bt.$b);
});
我将原始字符串附加到最终比较中,以区分俄语字符串和拉丁语字符串的音译产生相同音译的情况。您可以尝试创建一个聚合字符数组,如:
$customAlfabet = array(
'A', // EN
'А', // RU
'B', // EN
'Б', // RU
...
);
然后根据数组的数字键应用排序
uasort($newCompanyList, function ($a, $b) {
if ($a[0] > $b[0]) {
return 1;
} elseif ($a[0] < $b[0]) {
return -1;
}
return 0;
});
uasort($list,function($a,$b){
如果($a[0]>$b[0]){
返回1;
}elseif($a[0]<$b[0]){
返回-1;
}
返回0;
});
最好在这里应用递归,如果第一个字符相同-检查第二个字符,第三个字符,等等
注意,例如,发音与
Z
相同的字符3
,在俄语alfabet中定位为第9个字符,而Z
是英语中的最后一个字符,因此,从用户体验的角度来看,最好不要这样做。我想这是不可能的,你不能将西里尔字母与希腊字母进行排序,因为它们彼此不匹配。顺序不同,有些字母反之亦然,它们不知道。iconv('UTF-8','ASCII//translatit',-)代码>不支持西里尔文。要翻译西里尔文,您需要构建一个自定义函数,创建一个多维数组,其中第二个值是带有拉丁字符的西里尔文单词的含义,并按其排序。考虑到使用俄语单词时,Transliterator
非常糟糕,这不是最好的方法А
和Я
是俄语字母的首字母和末字母,它们都被音译为英语“a”,而“Я”的真正发音有点像“是”。嗯,你说得对。刚刚测试了“Яаааа”,它产生了“amalt”。令人失望的所以看起来在这种情况下,人工音译是更好的方法。对于更广泛的用途,我还没有发现任何其他工具做得更好的音译。我的意思是,当一个人不仅需要支持英语/俄语,而且还需要支持其他语言时,编写手动音译表是很麻烦的。没错,只是音译最适合阅读未知字符。它有它的用例,这只是一个例外。不过,有更好的俄语音译库,如果您可能需要的话,这是一个很好的库(文章是俄语的,但代码不是:)