PHP中sort()函数未使用SORT_STRING标志误判含'e'十六进制字符串的问题咨询
PHP中sort()函数未使用SORT_STRING标志误判含'e'十六进制字符串的问题咨询
各位好,我最近踩了个PHP排序的坑,想跟大家聊聊这个问题,也看看有没有同样遇到过的朋友或者大佬能再补充点细节。
我手里有这么一个数组,里面全是十六进制格式的字符串:
<?php $a = array ( 0 => 'bf3db17', 1 => '59bf48f', 2 => '8287265', 3 => 'c8e17d9', 4 => 'c32bd22', 5 => 'e0479db', 6 => '32697a5', 7 => '544259a', 8 => 'bf478eb', 9 => 'cb3fed4', 10 => 'ea4978b', 11 => '123ed84', 12 => 'eb2f56a', 13 => 'c7fc399', 14 => '18e4985', 15 => '19389f1', 16 => 'dd3be07', 17 => '48d9d88', 18 => '4f6105c', );
最开始我直接用sort($a)来排序,结果发现那些包含'e'的字符串排序位置完全不对,比如'e0479db'、'ea4978b'这些,明明是字母e开头,结果排到了一些数字开头的字符串后面,甚至和其他十六进制字符串的顺序完全混乱。
后来查了PHP手册才搞明白,原来sort()函数默认的排序规则是自动检测类型——它会尝试把字符串转换成数字来比较。而这些带'e'的十六进制字符串,会被PHP误识别成科学计数法的数字(比如'e0479db'会被解析成类似1e+xxxx的数值),这就导致比较逻辑完全跑偏了,自然排序结果就错得离谱。
解决方法其实也很简单,就是在调用sort()的时候,显式加上SORT_STRING标志,也就是写成:
sort($a, SORT_STRING);
这样PHP就会严格按照字符串的字节顺序来比较,不会再去尝试把字符串转成数字,那些十六进制字符串就能按照正常的字母/字符顺序排列了。
说真的这个坑挺隐蔽的,要是没注意到'e'会触发科学计数法的解析,真的要排查好久。不知道大家有没有遇到过类似的问题?或者有没有其他需要注意的PHP排序细节可以分享的?
备注:内容来源于stack exchange,提问作者Meyer Auslander - Tst
相关产品推荐
相关产品推荐

