You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

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

火山引擎 最新活动