在php多维数组中排序时忽略重音字符

在php多维数组中排序时忽略重音字符,php,arrays,sorting,iconv,Php,Arrays,Sorting,Iconv,我有如下所示的多维数组,我想在其中根据[name]字段进行排序。此外,重音字母的排序应该像没有重音一样 Array ( [chicago] => Array ( [community_name] => Chicago, IL [areas] => Array ( [0] => Array

我有如下所示的多维数组,我想在其中根据
[name]
字段进行排序。此外,重音字母的排序应该像没有重音一样

Array
(
    [chicago] => Array
        (
            [community_name] => Chicago, IL
            [areas] => Array
                (
                    [0] => Array
                        (
                            [name] => Array
                                (
                                    [0] => HELLO WORLD.
                                )
                        )

                    [1] => Array
                        (
                            [name] => Array
                                (
                                    [0] => Hello
                                )

                        )

                    [2] => Array
                        (
                            [name] => Array
                                (
                                    [0] => Administration.
                                )
                        )
                )

        )

    [chicago-and-surrounding-areas] => Array
        (
            [community_name] => Chicago (and surrounding areas), IL
            [areas] => Array
                (
                    [0] => Array
                        (
                            [name] => Array
                                (
                                    [0] => Covit Corp. 
                                )
                        )
                    [1] => Array
                        (
                            [name] => Array
                                (
                                    [0] => Câble-Axion Digital Corp. 
                                )
                        )   
                )

        )

    [cambridge-chicago] => Array
        (
            [community_name] => Cambridge (Chicago), IL
            [areas] => Array
                (
                    [0] => Array
                        (
                            [name] => Array
                                (
                                    [0] => Avocados.
                                )
                        )
                    [1] => Array
                        (
                            [name] => Array
                                (
                                    [0] => Aṕple.
                                )
                        )   
                )

        )

)
foreach ($array as &$locality) {
    usort($locality['areas'], function ($a, $b) {
        // return $a['name'][0] <=> $b['name'][0];
        return iconv('UTF-8', 'ISO-8859-8//TRANSLIT', $a['name'][0]) <=> iconv('UTF-8', 'ISO-8859-8//TRANSLIT', $b['name'][0]);
    });
}
这就是我想要实现的目标:

Array
(
    [chicago] => Array
        (
            [community_name] => Chicago, IL
            [areas] => Array
                (
                    [0] => Array
                        (
                            [name] => Array
                                (
                                    [0] => Administration.
                                )
                        )

                    [1] => Array
                        (
                            [name] => Array
                                (
                                    [0] => HELLO WORLD. 
                                )

                        )

                    [2] => Array
                        (
                            [name] => Array
                                (
                                    [0] => Hello
                                )
                        )
                )

        )

    [chicago-and-surrounding-areas] => Array
        (
            [community_name] => Chicago (and surrounding areas), IL
            [areas] => Array
                (
                    [0] => Array
                        (
                            [name] => Array
                                (
                                    [0] => Câble-Axion Digital Corp.
                                )
                        )
                    [1] => Array
                        (
                            [name] => Array
                                (
                                    [0] => Covit Corp. 
                                )
                        )   
                )

        )

    [cambridge-chicago] => Array
        (
            [community_name] => Cambridge (Chicago), IL
            [areas] => Array
                (
                    [0] => Array
                        (
                            [name] => Array
                                (
                                    [0] => Aṕple.
                                )
                        )
                    [1] => Array
                        (
                            [name] => Array
                                (
                                    [0] => Avocados.
                                )
                        )   
                )

        )

)
这是我尝试过的,但我想知道它是否在所有情况下都有效。在某些情况下,即使在排序后,重音字母的排名也低于非重音字母

我想知道我应该在下面的代码中做些什么更改,以便重音字母可以像没有重音的字母一样排序

Array
(
    [chicago] => Array
        (
            [community_name] => Chicago, IL
            [areas] => Array
                (
                    [0] => Array
                        (
                            [name] => Array
                                (
                                    [0] => HELLO WORLD.
                                )
                        )

                    [1] => Array
                        (
                            [name] => Array
                                (
                                    [0] => Hello
                                )

                        )

                    [2] => Array
                        (
                            [name] => Array
                                (
                                    [0] => Administration.
                                )
                        )
                )

        )

    [chicago-and-surrounding-areas] => Array
        (
            [community_name] => Chicago (and surrounding areas), IL
            [areas] => Array
                (
                    [0] => Array
                        (
                            [name] => Array
                                (
                                    [0] => Covit Corp. 
                                )
                        )
                    [1] => Array
                        (
                            [name] => Array
                                (
                                    [0] => Câble-Axion Digital Corp. 
                                )
                        )   
                )

        )

    [cambridge-chicago] => Array
        (
            [community_name] => Cambridge (Chicago), IL
            [areas] => Array
                (
                    [0] => Array
                        (
                            [name] => Array
                                (
                                    [0] => Avocados.
                                )
                        )
                    [1] => Array
                        (
                            [name] => Array
                                (
                                    [0] => Aṕple.
                                )
                        )   
                )

        )

)
foreach ($array as &$locality) {
    usort($locality['areas'], function ($a, $b) {
        // return $a['name'][0] <=> $b['name'][0];
        return iconv('UTF-8', 'ISO-8859-8//TRANSLIT', $a['name'][0]) <=> iconv('UTF-8', 'ISO-8859-8//TRANSLIT', $b['name'][0]);
    });
}
foreach($array as&$locality){
usort($Location['areas'),函数($a,$b){
//返回$a['name'][0]$b['name'][0];
返回iconv('UTF-8','ISO-8859-8//TRANSLIT',$a['name'][0])iconv('UTF-8','ISO-8859-8//TRANSLIT',$b['name'][0]);
});
}
您可以使用从变音符号中拆分字符,然后将其删除,以获得“基本”字符

function stripDiacritics(string $string): string {
    return preg_replace(
        '/[\x{0300}-\x{036f}]/u',
        '',
        Normalizer::normalize($string , Normalizer::FORM_D)
    );
}

foreach ($array as &$locality) {
    usort($locality['areas'], function ($a, $b) {
        return stripDiacritics($a['name'][0]) <=> stripDiacritics($b['name'][0]);
    });
}    
函数stripDiacritics(string$string):string{
返回预更换(
“/[\x{0300}-\x{036f}]/u”,
'',
Normalizer::normalize($string,Normalizer::FORM_D)
);
}
foreach($array as&$locality){
usort($Location['areas'),函数($a,$b){
返回stripDiacritics($a['name'][0])stripDiacritics($b['name'][0]);
});
}    
工作

剥夺

下次使用时,我们可以使用您的数组来测试代码:)

列表(源代码
\x{0300}-\x{036f}
)。

使用intl的Collator:

$arr=[
['key'=>'Avocado'],
['key'=>'Aṕple'],
];
$c=新的收尾器(“根”);
乌斯波特(
$arr,
功能($a,$b)使用($c){
返回$c->compare($a['key'],$b['key']);
}
);
var_转储($arr);
输出:

数组(2){
[0]=>
阵列(1){
[“键”]=>
字符串(7)“A”ṕple“
}
[1]=>
阵列(1){
[“键”]=>
串(7)“鳄梨”
}
}
其中“root”使用一组默认规则,这些规则似乎可以根据需要忽略重音,但您可以为特定语言的排序顺序指定实际的地区。

因此他会在他的
usort
中使用
$c->compare($a['name'][0],$b['name'][0])
,对吗?嘿,我还有一个。不一样。我想知道你是否可以看一看。