PHP中如何在switch语句中处理同类多参数的时间转换计算?
问题原因及修复方案
你的代码核心问题是同类参数没有累加,而是被最后一次赋值覆盖。在switch语句中,你使用=直接给变量赋值,而非+=进行累加操作。比如输入2m 2m时,第一次循环$timemin被设为120,第二次循环又重新赋值为120,最终结果自然是120而非预期的240。
另外,$argv数组的第一个元素是脚本文件名(比如time.php),你之前的implode+explode会把这个文件名也加入计算,这是多余的,应该直接截取从索引1开始的参数。
修复后的代码
<?php // 初始化时间变量 $timeday = 0; $timehour = 0; $timemin = 0; $timesec = 0; // 跳过$argv[0](脚本文件名),遍历所有参数 foreach (array_slice($argv, 1) as $time) { $letter = substr($time, -1); $aantal = substr($time, 0, -1); // 使用+=进行累加,而非直接赋值 switch ($letter) { case "d": $timeday += $aantal * 86400; break; case "u": $timehour += $aantal * 3600; break; case "m": $timemin += $aantal * 60; break; case "s": $timesec += $aantal * 1; break; } } // 最后计算总数,不需要放在循环里 $total = $timeday + $timehour + $timemin + $timesec; echo $total . " Seconds" . PHP_EOL;
关键修改点
- 用
array_slice($argv, 1)跳过脚本文件名,只处理用户输入的时间参数 - 将switch中的
=改为+=,实现同类参数的累加计算 - 将
$total的计算移到循环外部,避免重复计算(循环内计算不影响结果,但没必要)
现在测试php time.php 2m 2m会输出240 Seconds,混合参数比如php time.php 1d 2u 3m 4s也会正确计算总和。
内容的提问来源于stack exchange,提问作者weggooie man
相关产品推荐
相关产品推荐

