为何PHP 7中使用SORT_NUMERIC的sort()函数会倒序排序?
为什么PHP7中使用
SORT_NUMERIC的sort()会出现倒序? 首先得明确SORT_NUMERIC参数的核心作用:它会让sort()把每个数组元素转换为数值类型来做比较。你例子里的这些字符串(比如"img12.png"),因为开头是非数字字符,PHP会把它们统一转换成数值0——这个转换规则在PHP5和PHP7里是完全一致的。
那为什么排序结果差这么多?核心原因是PHP7换掉了sort()的底层排序算法:
- PHP5及更早版本:用的是快速排序(Quicksort),这是一种不稳定的排序算法。当两个元素转成数值后相等(比如你的所有元素都是
0),快速排序的实现细节可能会打乱原数组的顺序,你看到的"升序"其实是个意外的副作用,根本不是SORT_NUMERIC的预期行为。 - PHP7及之后版本:改用了Timsort(结合归并排序和插入排序的稳定排序算法),当元素比较结果相等时,会严格保留它们在原数组里的相对顺序。不过你说PHP7输出是倒序,这看起来和稳定排序的特性不太匹配——可能是测试环境有特殊情况,或者你测试时不小心反转了数组?但更关键的是:
SORT_NUMERIC本来就不适合用来排序这类带数字的字符串。
如果你想按照字符串里嵌入的数字做自然排序(比如img1.png < img2.png < img10.png < img12.png),才是正确的做法:
- 用
natsort()函数:$array = array("img12.png", "img10.png", "img2.png", "img1.png"); natsort($array); print_r($array); - 或者用
sort()加SORT_NATURAL参数:$array = array("img12.png", "img10.png", "img2.png", "img1.png"); sort($array, SORT_NATURAL); print_r($array);
这两种方式在PHP5.4+和PHP7里都会给出你预期的升序结果。
总结一下:你看到的PHP5和PHP7的差异,本质是SORT_NUMERIC处理相等数值元素时,底层排序算法变化导致的行为差异;而SORT_NUMERIC从来都不是处理这类带数字字符串的正确方式,自然排序才是你需要的解决方案。
内容的提问来源于stack exchange,提问作者L.A. Rabida
相关产品推荐
相关产品推荐

