如何在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
相关产品推荐
相关产品推荐

