如何将格式为2:30的时长数组求和并转换为分钟/小时格式?
解决时长数组求和并格式化输出的问题
我来帮你搞定这个时长求和的需求!你之前尝试的代码无效,主要有两个原因:一是array_sum只能对数值数组求和,而你从数据库获取的是包含整行数据的数组;二是length字段是字符串格式的时长(比如2:30),没法直接参与数值计算。下面是具体的实现方案:
步骤1:计算总时长(转换为秒数求和)
首先我们需要把每个字符串格式的时长转换成秒数,然后累加得到总秒数,这样后续的格式转换会更方便:
// 从数据库获取所有歌曲的时长字段 $songs = $db->super_query("SELECT length FROM mixes_songs WHERE collectionId = '$albumId'"); $totalSeconds = 0; foreach ($songs as $song) { // 拆分时长字符串(格式为 mm:ss,比如"2:30") list($minutes, $seconds) = explode(':', $song['length']); // 转换成秒数并累加 $totalSeconds += (int)$minutes * 60 + (int)$seconds; }
注意:如果你的时长格式是
hh:mm(时:分),只需要把计算逻辑改成:$totalSeconds += (int)$hours * 3600 + (int)$minutes * 60;
步骤2:将总秒数转换成小时+分钟的格式
接下来把总秒数转换成你需要的小时和分钟格式:
// 计算总小时数 $totalHours = floor($totalSeconds / 3600); // 计算剩余秒数(去掉整小时后的部分) $remainingSeconds = $totalSeconds % 3600; // 计算剩余分钟数 $totalMinutes = floor($remainingSeconds / 60);
步骤3:格式化输出字符串
最后根据小时和分钟的数值,生成符合要求的输出格式:
$durationOutput = ''; if ($totalHours > 0) { $durationOutput .= "{$totalHours}hr"; // 如果还有剩余分钟,加上分钟部分 if ($totalMinutes > 0) { $durationOutput .= " {$totalMinutes} mins"; } } else { $durationOutput .= "{$totalMinutes} MINS"; } // 输出结果,比如总时长5分19秒会输出"5 MINS",总时长1小时5分会输出"1hr 5 mins" echo $durationOutput;
为什么原代码无效?
再回头看你之前的代码:
$length = $db->super_query("SELECT * FROM mixes_songs WHERE collectionId = '$albumId'"); $row['length'] = array_sum($length);
$length是数据库返回的多条记录的数组,每个元素是包含所有字段的关联数组,array_sum无法直接对这种数组求和;- 即使你只取
length字段,它也是字符串类型,array_sum会把字符串转换成0,所以结果肯定不对。
内容的提问来源于stack exchange,提问作者Pop
相关产品推荐
相关产品推荐

