我最近了解到PHP已经通过intl扩展支持Unicode排序算法:
$array = array
(
'al', 'be',
'Alpha', 'Beta',
'Álpha', 'Àlpha', 'Älpha',
'かたかな',
'img10.png', 'img12.png',
'img1.png', 'img2.png',
);
if (extension_loaded('intl') === true)
{
collator_asort(collator_create('root'), $array);
}
Array
(
[0] => al
[2] => Alpha
[4] => Álpha
[5] => Àlpha
[6] => Älpha
[1] => be
[3] => Beta
[11] => img1.png
[9] => img10.png
[8] => img12.png
[10] => img2.png
[7] => かたかな
)
正如您所看到的,这似乎完美地工作,即使是混合大小写字符串!到目前为止,我遇到的唯一缺点是没有支持自然排序,我想知道如何最好地解决这个问题,以便我可以融合两个世界的优点。
我尝试指定Collator :: SORT_NUMERIC
排序标志,但结果混乱不堪:
collator_asort(collator_create('root'), $array, Collator::SORT_NUMERIC);
Array
(
[8] => img12.png
[7] => かたかな
[9] => img10.png
[10] => img2.png
[11] => img1.png
[6] => Älpha
[5] => Àlpha
[1] => be
[2] => Alpha
[3] => Beta
[4] => Álpha
[0] => al
)
然而,如果我只使用img*.png
的值运行相同的测试,我将获得理想的输出:
Array
(
[3] => img1.png
[2] => img2.png
[1] => img10.png
[0] => img12.png
)
有没有办法在增加自然排序功能的同时保留Unicode排序?
intl
中没有实现自然排序。 - Alix Axel