php 自然排序法,PHP中的自然排序算法,支持Unicode?

是否可以使用自然顺序算法在PHP中使用Unicode / UTF-8字符对数组进行排序?例如(此数组中的顺序正确排序):

$array = array

(

0 => 'Agile',

1 => 'Ágile',

2 => 'Àgile',

3 => 'Âgile',

4 => 'Ägile',

5 => 'Ãgile',

6 => 'Test',

);

如果我尝试使用asort($array),我会得到以下结果:

Array

(

[0] => Agile

[6] => Test

[2] => Àgile

[1] => Ágile

[3] => Âgile

[5] => Ãgile

[4] => Ägile

)

并使用natsort($array):

Array

(

[2] => Àgile

[1] => Ágile

[3] => Âgile

[5] => Ãgile

[4] => Ägile

[0] => Agile

[6] => Test

)

如何在PHP 5下实现返回正确结果顺序(0,1,2,3,4,5,6)的函数?我的系统上可以使用所有多字节字符串函数(mbstring,iconv,…).

编辑:我想natsort()值,而不是键 – 我明确定义键(并使用asort()而不是sort())的唯一原因是为了简化找出排序的位置的工作unicode值出错了.

解决方法:

问题并不像第一眼看上去那么容易回答.这是PHP缺乏unicode支持的领域之一.

其他海报建议的所有natsort()的Frist与排序您要排序的类型的数组无关.您正在寻找的是区域设置感知排序机制,因为使用扩展字符排序字符串始终是使用语言的问题.让我们以德语为例:A和Ä有时可以按照相同的字母(DIN 5007/1)进行分类,有时Ä可以按照事实上的“AE”(DIN 5007/2)进行分类.相比之下,在瑞典语中,Ä出现在字母表的末尾.

如果您不使用Windows,那么您很幸运,因为PHP提供了一些功能.使用setlocale(),usort(),strcoll()的组合以及适用于您的语言的正确UTF-8语言环境,您可以得到以下结果:

$array = array('Àgile', 'Ágile', 'Âgile', 'Ãgile', 'Ägile', 'Agile', 'Test');

$oldLocal = setlocale(LC_COLLATE, '<>.utf8');

usort($array, 'strcoll');

setlocale(LC_COLLATE, $oldLocal);

请注意,为了对UTF-8字符串进行排序,必须使用UTF-8语言环境变体.我将上面示例中的语言环境重置为其原始值,因为使用setlocale()设置语言环境可以在其他正在运行的PHP脚本中引入副作用 – 有关详细信息,请参阅PHP手册.

当您使用Windows机器时,目前没有解决此问题的方法,并且在我假设的PHP 6之前不会有任何解决方案.请查看我自己的针对此特定问题的question.

标签:php,arrays,sorting,unicode,utf-8

来源: https://codeday.me/bug/20190926/1821364.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值