对俄语/英语列表进行排序



我有以下数组,其中有英语和俄语单词:

[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);
});

我将原始字符串附加到最终比较中,以区分俄语字符串和拉丁字符串的音译产生相同音译的情况。

最新更新