排序俄语/英语列表

时间:2014-11-28 11:02:45

标签: 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', 'ASCII//TRANSLIT', $b);
        return strcmp($at, $bt);
    });

预期结果如下:

[0]  => Airline_1
[2]  => Авиатор
[3]  => Аврора
[1]  => Second Air

问题在于它确实对列表进行了排序,但它将它们分开排序,我需要俄语' A'紧跟英语' A'如果这是有道理的。我怎么能实现这个目标呢?

2 个答案:

答案 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的角度来做。