1

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

可以按字母顺序找到各种语言的此类约定的列表: 特定于语言的约定

对像 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
    )
)
4

1 回答 1

2

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

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

排序

SORT_LOCAL_STRING使用array_multisort()参数时可以设置。记得通过之前的设置来选择合适的区域信息(例如de_DEsetlocal()

// 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中找到。(来源)

分组

有一种通过使用预定义组进行分组的运行良好的算法。这意味着您要么必须手动定义映射表(例如Ä = AÖ = O...)。

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

SQL作为替代?

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

于 2013-03-30T03:38:48.823 回答