PHP中如何在多维数组排序时忽略带重音符号的字符?

3

我有以下多维数组,我想按照[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]);
    });
}
2个回答

2

使用intl的Collator:

$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' 使用一组默认规则,似乎可以忽略重音符号,但您可以为特定语言指定实际的区域设置以进行排序。


1
那么他会在 usort 中使用 $c->compare($a['name'][0], $b['name'][0]) 对吧? - SirPilan

0

您可以使用Normalizer来将字符从变音符号中分离出来,并在之后删除它们,以获取“基本”字符。

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

正在处理 示例

这里 去掉。

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

变音符号列表(\x{0300}-\x{036f} 的来源)。


嘿,我还有一个问题。它不太相似。我想知道你能否看一下。 - user1950349

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接