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

标签 php arrays sorting iconv

<分区>

我有如下所示的多维数组,我想在其中根据 [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.
                                )
                        )   
                )

        )

)

这是我想要实现的:

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.
                                )
                        )   
                )

        )

)

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

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

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

最佳答案

使用 intl 的整理器:

$arr = [
  ['key' => 'Avocado'],
  ['key' => 'Aṕple'],
];

$c = new Collator('root');
usort(
    $arr,
    function($a, $b) use($c){
        return $c->compare($a['key'], $b['key']);
    }
);
var_dump($arr);

输出:

array(2) {
  [0]=>
  array(1) {
    ["key"]=>
    string(7) "Aṕple"
  }
  [1]=>
  array(1) {
    ["key"]=>
    string(7) "Avocado"
  }
}

其中“root”使用一组默认规则,这些规则似乎根据需要忽略重音,但您可以为特定于语言的排序顺序指定实际区域设置。

关于php - 在多维数组中的 php 中排序时忽略重音字符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63291865/

相关文章:

php - CodeIgniter - 文件上传需要验证

javascript - 使用 javascript/jquery 从现有数组创建一个新数组,该数组保存某个项目存在的次数

java - 如何对具有实现相同接口(interface)的不同对象的列表进行排序?

java - 无法在图像数组中存储和显示多个图像

c# - 将 byte[] 转换为 char[]

javascript - 按数组内容排序

c - 我在打印两个输入数组的交集的 C 程序中遇到问题

php: 从字符串中删除 URL

php - jQuery 通过 $.post 触发点击

php - 使用 laravel 命令生成多个文件