我有以下数组,其中有英语和俄语单词:
[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"旁边。我怎样才能做到这一点?
您可以尝试制作一个聚合字符数组,例如:
$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 中定位为第 9n 个字符,而Z
英语中的最后一个字符,因此最好不要从 UX 的角度来看这样做。
您可以使用 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);
});
我将原始字符串附加到最终比较中,以区分俄语字符串和拉丁字符串的音译产生相同音译的情况。