gpt4 book ai didi

php - UCA + 自然排序

转载 作者:可可西里 更新时间:2023-11-01 13:21:52 32 4
gpt4 key购买 nike

我最近了解到 PHP 已经支持 Unicode Collation Algorithm via the intl extension :

$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] => かたかな
)

如您所见,即使是混合大小写的字符串,这似乎也能完美运行!到目前为止我遇到的唯一缺点是不支持 natural sorting我想知道解决这个问题的最佳方法是什么,以便我可以融合两个世界中最好的东西。

我尝试指定 Collat​​or::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 排序,同时添加自然排序功能?

最佳答案

在深入研究文档后,我找到了解决方案:

if (extension_loaded('intl') === true)
{
if (is_object($collator = collator_create('root')) === true)
{
$collator->setAttribute(Collator::NUMERIC_COLLATION, Collator::ON);
$collator->asort($array);
}
}

输出:

Array
(
[0] => al
[3] => Alpha
[5] => Álpha
[6] => Àlpha
[7] => Älpha
[1] => be
[4] => Beta
[10] => img1.png
[11] => img2.png
[8] => img10.png
[9] => img12.png
[2] => かたかな
)

关于php - UCA + 自然排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5056586/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com