我有以下数组,其中包含英语和俄语单词:
[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'如果这是有道理的。我怎么能实现这个目标呢?
答案 0 :(得分:1)
您可以使用Intl扩展名和Transliterator对象,如下所示:
$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);
});
我已将原始字符串附加到最终比较中,以区分俄语字符串和拉丁语音译产生相同音译的情况。
答案 1 :(得分:1)
您可以尝试制作一个聚合的字符数组,如:
$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;
});
最好在这里应用递归,如果第一个字符是相同的 - 检查第二个字符,第三个等等。
注意,例如字符З
,其等效声音为Z
,定位为俄语alfabet中的第9个字符,而Z
为最后一个用英文写的,所以最好不要从UX的角度来做。