PHP usort函数在排序键缺失时的特殊行为原因咨询
PHP usort函数在排序键缺失时的特殊行为原因咨询
最近我在用PHP的usort函数时发现了一个挺奇怪的行为,想请大家帮忙分析下背后的原因:
当我用usort对数组排序,但所有数组元素都不包含排序依赖的键(比如我代码里的sort_order)时,只要数组元素数量≤16,排序后的顺序就能保持和原数组一致;可一旦元素数量≥17,排序后的顺序就完全乱了。
我写了一段测试代码来复现这个问题:
function my_sort($a, $b) { return (int)$a['sort_order'] - (int)$b['sort_order']; } // 测试18个元素的场景 $array = []; for ($i=0; $i < 18; $i++) { $array[$i] = [ 'title' => $i ]; } echo "排序前(18个元素):<br>"; foreach ($array as $key => $value) { echo $key . "=>" . $value['title'] . "<br>"; } echo "<br><br>"; usort($array, "my_sort"); echo "排序后(18个元素):<br>"; foreach ($array as $key => $value) { echo $key . "=>" . $value['title'] . "<br>"; } echo "<br><br><br>"; echo "元素个数≤16时,排序后顺序会保留:<br><br><br>"; // 测试16个元素的场景 $array = []; for ($i=0; $i < 16; $i++) { $array[$i] = [ 'title' => $i ]; } echo "排序前(16个元素):<br>"; foreach ($array as $key => $value) { echo $key . "=>" . $value['title'] . "<br>"; } echo "<br><br>"; usort($array, "my_sort"); echo "排序后(16个元素):<br>"; foreach ($array as $key => $value) { echo $key . "=>" . $value['title'] . "<br>"; }
我分别在PHP7.3和8.4版本上做了测试,结果都是一样的。有没有大佬能解释下为什么会出现这种差异呢?
内容来源于stack exchange




