Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/flutter/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 俄语/英语列表排序_Php_Sorting_Cyrillic - Fatal编程技术网

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”。令人失望的所以看起来在这种情况下,人工音译是更好的方法。对于更广泛的用途,我还没有发现任何其他工具做得更好的音译。我的意思是,当一个人不仅需要支持英语/俄语,而且还需要支持其他语言时,编写手动音译表是很麻烦的。没错,只是音译最适合阅读未知字符。它有它的用例,这只是一个例外。不过,有更好的俄语音译库,如果您可能需要的话,这是一个很好的库(文章是俄语的,但代码不是:)