php 如何接受多个参数

u2nhd7ah  于 2023-01-12  发布在  PHP
关注(0)|答案(2)|浏览(136)

我有一个程序,计算天数,小时数,分钟数或秒数,但它只能接受1个参数,如“1d”= 86400秒。
现在我想让它计算当我给予它一些像“1d 3h 16m 2s“,并传递到秒的数量。同样,当给一个错误的输入,我想让它告诉用户一些像“错误的输入”。
我怎么能做到呢?
这是我到目前为止得到的代码,现在我需要修改它到新的设置seconds calculator

hi3rlvi2

hi3rlvi21#

为了匹配几个单位时间,我使用了preg_match_all()函数,然后对每个时间单位使用开关迭代。计算每个单位的秒数并求和。

<?php
   $input = '1d 3h 16m 2s';
    $seconds = 0;
    $pattern = "/(\d+)(d|h|m|s)/";

    preg_match_all($pattern, $input, $matches);

    for ($i = 0; $i < count($matches[0]); $i++) {
        switch ($matches[2][$i]) {
            case "d":
                $seconds += (int)$matches[1][$i] * 86400;
                break;
            case "h":
                $seconds += (int)$matches[1][$i] * 3600;
                break;
            case "m":
                $seconds += (int)$matches[1][$i] * 60;
                break;
            case "s":
                $seconds += (int)$matches[1][$i];
                break;
            default:
                echo "Invalid input format";
                return;
        }
    }

    echo $seconds;

PHP在线版:https://onlinephp.io/c/f7d8c

zaq34kh6

zaq34kh62#

假设没有更高的单位需要解析,并且单位总是按大端顺序排列,那么可以使用一个正则表达式模式来解析字符串中的所有数据,然后使用简单的算术来计算秒数。
正则表达式将尝试捕获每个可选单元的数目。即使给定单元不存在,匹配数组仍将保留该位置,以便元素始终被一致地放置。子模式是相当重复的,因此这将使它更容易在需要时扩展/缩减。
代码:(Demo

preg_match('/^(?:(\d+)d ?)?(?:(\d+)h ?)?(?:(\d+)m ?)?(?:(\d+)s)?$/', $input, $m);
echo ((int) ($m[1] ?? 0) * 86400)
     + ((int) ($m[2] ?? 0) * 3600)
     + ((int) ($m[3] ?? 0) * 60)
     + (int) ($m[4] ?? 0) . " seconds";

如果输入数据的格式一致,并且总是包含每个单位,那么这个过程就简单得多,因为sscanf()可以将数字直接解析为整数。

sscanf($input, '%dd %dh %dm %ds', $d, $h, $m, $s);
echo $d * 86400 + $h * 3600 + $m * 60 + $s;

相关问题