【问题标题】:PHP Group array alphabetically regarding language-specific conventions关于特定语言约定的 PHP 组数组按字母顺序排列
【发布时间】:2013-03-17 12:43:22
【问题描述】:

我正在寻找一种智能解决方案,可以对带有扩展字符的字符串进行排序。这始终是所用语言的问题。让我们以德语为例:A 和 Ä 有时可以被排序为好像它们是同一个字母 (DIN 5007/1),有时 Ä 可以被排序为实际上是 "AE" (DIN 5007/2)。相比之下,在瑞典语中,Ä 出现在字母表的末尾。

可以在Alphabetical order: Language-specific conventions 找到各种语言的此类约定列表。

按照 DIN 5007/1 对数组进行分组的最快方法是什么?

$array = array
(
    0 => 'Agile',
    1 => 'Ágile',
    2 => 'Àgile',
    3 => 'Âgile',
    4 => 'Ägile',
    5 => 'Ãgile',
    6 => 'Test',
);

// Grouped Result:

Array
(
    'A' => array
    (
        [0] => Agile
        [1] => Àgile
        [2] => Ágile
        [3] => Âgile
        [4] => Ãgile
        [5] => Ägile
    ),
    'T' => array
    (
        [0] => Test
    )
)

【问题讨论】:

    标签: php arrays localization group-by sorting


    【解决方案1】:

    我认为没有一种快速的方法可以对 DIN 5007/1 之类的数组进行分组。至少我没有看到。

    解决方案需要考虑两个方面: 排序算法,它尊重根据 DIN 5007/1 进行的排序。将尊重由特殊字符引起的相似性的结果分组。

    排序

    使用array_multisort()参数时可以设置SORT_LOCAL_STRING。请记住通过在前面设置setlocal() 来选择适当的语言环境信息(例如de_DE)。

    // randomly sorted terms
    $array = array(
        'Agile',
        'Ágile',
        'Test',
        'Âgile',
        'Ägile',
        'Ãgile',
        'Àgile',
    );
    
    setlocale(LC_ALL, '');
    array_multisort($array, SORT_ASC, SORT_LOCALE_STRING);
    print_r($array);
    

    但这不会导致你想要的结果。

    Array
    (
        [0] => Agile
        [1] => Test
        [2] => Àgile
        [3] => Ágile
        [4] => Âgile
        [5] => Ãgile
        [6] => Ägile
    )
    

    您必须深入了解可用的语言环境,也许手动添加所有相关的语言环境。

    类别/地区名称可以在 » RFC 1766 和 » ISO 639 中找到。 (source)

    分组

    使用预定义的组有一个well-working algorithm for grouping。这意味着您要么必须手动定义映射表(例如 Ä = AÖ = O ...)。

    或者您可以实施相似性检查,例如similar_text()levenshtein()

    SQL 作为替代?

    这个问题在 SQL 中能在多大程度上更有效和高效地实现需要进一步思考。

    【讨论】:

    • 预先:如果这可以通过一个狭窄的三班轮来完成,请打我!
    猜你喜欢
    • 1970-01-01
    • 2013-03-18
    • 1970-01-01
    • 2021-06-25
    • 2010-11-08
    • 2013-07-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多