代码片段展示了如何将歌曲时长(以秒为单位,可能包含毫秒)转换为分钟、秒和毫秒的格式化输出。让我们改进这段代码,使其更健壮、更易读,并处理潜在的错误。

<code class="php"><?php
$jsonString = '[{"time": "123.456", "lineLyric": "第一句歌词"}, {"time": "246.789", "lineLyric": "第二句歌词"}]'; // 示例JSON数据
$jsonData = json_decode($jsonString, true);
if (json_last_error() !== JSON_ERROR_NONE) {
die("JSON解码错误: " . json_last_error_msg()); // 处理JSON解码错误
}
foreach ($jsonData as $item) {
$timeInSeconds = (float)$item['time']; // 直接将time转换为浮点数
if (!is_numeric($timeInSeconds)) {
echo "无效的时间格式: {$item['time']}\n"; // 处理非数字时间值
continue; // 跳过当前项目
}
$minutes = floor($timeInSeconds / 60);
$seconds = floor($timeInSeconds % 60);
$milliseconds = round(($timeInSeconds * 1000) % 1000); // 计算毫秒,并四舍五入
$formattedTime = sprintf('%d:%02d.%03d', $minutes, $seconds, $milliseconds); // 使用.作为毫秒分隔符
echo "[$formattedTime]{$item['lineLyric']}\n";
}
?></code>
改进说明:
-
错误处理: 添加了
json_last_error()检查,以处理JSON解码错误。如果解码失败,会显示错误消息并终止脚本。 -
数据类型转换: 直接使用
(float)$item['time']将time字段转换为浮点数,简化代码并避免潜在的类型错误。 -
输入验证: 添加了
is_numeric()检查,确保time字段的值是数字。如果不是数字,则会输出错误消息并跳过该项目。 -
毫秒计算: 改进毫秒的计算方式,使用
round()函数进行四舍五入,使其更精确。 -
格式化输出: 将毫秒分隔符改为
., 更符合常见的毫秒表示方式。
此改进后的代码更加稳健,能够处理各种情况,包括无效的JSON数据和非数字的时间值,并提供更清晰的错误提示。 它也更易于理解和维护。










