升级PHP 8.2:关于ksort与krsort变更的疑问
关于PHP 8.2中ksort()/krsort() SORT_REGULAR模式变更的解释
你没看到差异的核心原因是测试用例没触发行走差异的场景——只有当数组键是数字字符串且按字符串字典序和数字值排序结果不同时,这个变更才会显现。
变更的本质
- PHP 8.1及更早版本:
ksort()/krsort()在SORT_REGULAR模式下,数字字符串键之间的比较完全遵循字符串字典序(按字符的ASCII值逐一比较)。 - PHP 8.2及以后版本:该模式下会遵循PHP 8的标准比较规则——当两个键都是数字字符串时,会按数字值进行比较。
触发差异的测试示例
构造一个包含"10"和"2"这类数字字符串键的数组:
$arr = [ "2" => "two", "10" => "ten", "1" => "one" ]; ksort($arr, SORT_REGULAR); print_r($arr);
- PHP 8.1及更早输出:按字符串字典序,
"10"的首字符'1'小于"2"的'2',所以排在"2"前面:Array ( [1] => one [10] => ten [2] => two ) - PHP 8.2及以后输出:按数字值排序,
10大于2,所以"2"排在"10"前面:Array ( [1] => one [2] => two [10] => ten )
为什么你的测试没差异
如果你的测试用例是类似["1", "2", "3"]这类键,无论是按字符串字典序还是数字值排序,结果都完全一致;另外,如果数组中同时存在数字键和数字字符串键,PHP会自动将数字字符串键转换为数字键(比如"2"会变成2),这种情况下排序逻辑也不会有差异。
内容的提问来源于stack exchange,提问作者callmebob
相关产品推荐
相关产品推荐

