PHP程序扩展:支持多单位时长表达式转换为总秒数并处理错误输入
PHP程序扩展:支持多单位时长表达式转换为总秒数并处理错误输入
嘿,我来帮你把这个程序扩展成支持多单位组合输入,同时加上错误处理功能!你的现有代码只能处理单个参数,咱们一步步改造它:
核心思路
- 把输入的多个时长片段(比如
1d、3h)拆分开来 - 验证每个片段的格式是否合法(必须是数字+指定单位的形式,单位只能是d/h/m/s)
- 把每个合法片段转换成秒数后累加
- 一旦遇到不符合要求的输入,立刻返回错误提示
改造后的完整代码
<?php // 先检查是否有输入参数 if (!isset($argv[1]) || empty($argv[1])) { echo "wrong input\n"; exit; } // 定义单位到秒数的映射表,比switch更简洁易维护 $unitMap = [ 'd' => 86400, 'h' => 3600, 'm' => 60, 's' => 1, ]; $totalSeconds = 0; // 按空格拆分输入的多个时长片段 $parts = explode(' ', $argv[1]); foreach ($parts as $part) { // 用正则验证每个片段的格式:必须是一个或多个数字+指定单位 if (!preg_match('/^(\d+)([dhms])$/', trim($part), $matches)) { echo "wrong input\n"; exit; } $value = (int)$matches[1]; $unit = $matches[2]; // 检查单位是否在我们支持的列表里 if (!isset($unitMap[$unit])) { echo "wrong input\n"; exit; } // 累加秒数 $totalSeconds += $value * $unitMap[$unit]; } // 输出最终总秒数 echo $totalSeconds . "\n"; ?>
代码说明
- 输入检查:首先判断用户有没有传入参数,避免空输入导致报错
- 单位映射表:用数组替代switch语句,后续要新增支持的单位,直接在数组里添加键值对即可,维护成本更低
- 正则验证:
/^(\d+)([dhms])$/确保每个片段都是「数字+合法单位」的格式,比如12h合法,12x或者h12这类不合法输入会直接触发错误提示 - 错误处理:只要任何一个片段格式不对、单位不支持,立刻输出
wrong input并终止程序 - 累加计算:把每个合法片段的秒数累加,最后输出总结果
测试示例
- 输入
php yourscript.php "1d 3h 16m 2s",会输出94562(计算逻辑:186400 + 33600 + 16*60 + 2 = 86400+10800+960+2=94562) - 输入
php yourscript.php "5x"或者php yourscript.php "1d 2h 3",都会输出wrong input
备注:内容来源于stack exchange,提问作者valentijnkusse
相关产品推荐
相关产品推荐

