You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.13 17:38:07