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

如何在PHP多维数组中获取最快的前3条耗时记录

解决方案

方案1:无需修改原数组,直接排序取前3条

直接用usort()结合自定义排序规则,基于总耗时(分钟转秒+秒数)升序排列,再截取前3条。这种方式不用给原数组加额外键,性能更优且不改动原数组:

$originalArray = [
    ["name" => "John Doe", "time_minutes" => 34, "time_seconds" => 12],
    ["name" => "Jane Doe", "time_minutes" => 24, "time_seconds" => 32],
    ["name" => "John Doe2", "time_minutes" => 14, "time_seconds" => 52],
    ["name" => "Jane Doe2", "time_minutes" => 54, "time_seconds" => 55]
];

// 按总耗时升序排序(耗时越少排名越靠前)
usort($originalArray, function($a, $b) {
    $totalA = $a['time_minutes'] * 60 + $a['time_seconds'];
    $totalB = $b['time_minutes'] * 60 + $b['time_seconds'];
    return $totalA - $totalB;
});

// 截取前3条到新数组
$top_3 = array_slice($originalArray, 0, 3);

方案2:解决你之前的foreach引用问题(如需保留total_time键)

如果确实要给原数组添加total_time键,循环时必须用引用(&$item),这样修改的是原数组元素而非副本:

foreach($originalArray as &$item) {
    $item['total_time'] = $item['time_minutes'] * 60 + $item['time_seconds'];
}
unset($item); // 解除引用,避免后续操作污染数组

// 按total_time升序排序
usort($originalArray, function($a, $b) {
    return $a['total_time'] - $b['total_time'];
});

$top_3 = array_slice($originalArray, 0, 3);

性能说明

  • 方案1仅需一次排序操作(底层为快速排序,时间复杂度O(n log n)),无额外循环,适合大数据量场景。
  • 方案2多一次循环,但如果后续需多次使用total_time,提前添加该键会更便捷。

若数据量极大,可考虑直接找出最小的3个值对应的元素以避免全量排序,但实现复杂度较高,上述两种方案在多数场景下已足够高效。

内容的提问来源于stack exchange,提问作者Fred Logan

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.22 16:14:52