我正在寻找一个聪明的解决方案,排序字符串与扩展字符。这始终是一个使用语言的问题。让我们以德语为例:a和in有时可以被排序,就好像它们是同一个字母(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
)
)发布于 2013-03-30 03:38:48
我不认为有一个快速的方法,分组像DIN 5007/1这样的数组,至少我没有看到一个。
一个解决方案需要考虑两个方面:排序算法,即根据DIN 5007/1进行排序的排序算法。将结果分组,以尊重特殊字符引起的相似性。
排序
您可以在使用SORT_LOCAL_STRING参数时设置array_multisort()。请记住通过在前面设置de_DE来选择适当的区域设置信息(例如setlocal() )。
// 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
)您将不得不深入研究可用的地区,可能需要手动添加所有相关的locales工作。
类别/地区名称可以在?RFC 1766和?ISO 639中找到。(来源)
分组
通过使用预定义的组有一个一种良好的分组算法。这意味着您必须手动定义映射表(例如Ä = A和Ö = O .)。
或者您可以实现相似性检查,例如similar_text()或levenshtein()。
SQL作为替代?
在SQL中如何更有效、更高效地实现这个问题,还需要进一步考虑。
https://stackoverflow.com/questions/15460817
复制相似问题