我正在尝试制作一个IF语句,该语句可以计算哪个“剩余时间”更大。
这是我的代码。

if('6h : 27m : 45s' > '6h : 27m : 15s') {
    echo 'Timer to the left is bigger';
}

这段代码可以正常工作,它实际上会打印计时器,在左侧,计时器更大

但是,当任何时间值(小时,分钟或秒)仅为一位而不是两位时。没用像这样:
if('6h : 27m : 45s' > '6h : 27m : 5s') {
    echo 'Timer to the left is bigger';
}

这次打印出左边的计时器是更大的。这是因为右侧的计时器仅剩 5s ,比 15s 少,但这是因为它只有一位而不是两位,并且IF语句不明白这一点。

如何将其解析为if语句的可理解格式?

注意该字符串来自API,无论如何我都无法对其进行编辑。

最佳答案

您的帖子建议所有三个时间单位始终可用。因此,只需创建两个数字数组即可。 PHP7的太空船运算符将在处理两个数值时进行数值比较。它将根据需要从左到右比较元素。

不需要时间解析,因为时间单位是从大到小排序的。

代码:(Demo)

$left = '6h : 27m : 5s';
$right = '6h : 27m : 15s';

$lookup = [
    -1 => 'less',
    0 => 'equal',
    1 => 'more'
];

$lArray = preg_split('/\D+/', $left, 0, PREG_SPLIT_NO_EMPTY);
$rArray = preg_split('/\D+/', $right, 0, PREG_SPLIT_NO_EMPTY);

$comparison = $lArray <=> $rArray;
echo $comparison . ' -> ' . $lookup[$comparison];

输出:
-1 -> less

如果只需要对-1进行条件检查,就可以对其进行写操作。查找纯粹是为了澄清演示。

换一种说法:
if ((preg_split('/\D+/', $left, 0, PREG_SPLIT_NO_EMPTY) <=> preg_split('/\D+/', $right, 0, PREG_SPLIT_NO_EMPTY)) == -1) {
    // left is less than right
}

我刚刚注意到Wiimm的version_compare()即时调用来解析您的时间表达式。 (+1,但我想我需要解释更多)虽然它不是预期的用途,但它是一种聪明而可靠的非正则表达式技术,因为在您的时间单位子字符串(hms)中找不到在两个字符串中统一定位的具有特殊含义的开发阶段子字符串列表。这意味着,即使您有具有特殊含义的非数字子字符串,也仍将仅基于数字值来正确评估比较。

特殊子串的顺序为:
  • dev
  • alphaa
  • betab
  • RCrc
  • #
  • plp

  • 此功能是一种三向比较工具-类似于飞船操作员。它还接受第三个参数来命令它返回布尔响应。如果第一个字符串“大于”第二个字符串,则使用gt将返回true。尽管第三个参数是缩写,但我发现它比检查-1更直观。

    代码:(Demo)
    if (version_compare($left, $right, 'gt')) {
        echo 'left is greater than right';
    } else {
        echo 'left is less than or equal to right';
    }
    

    输出:
    left is less than or equal to right
    

    10-07 19:14
    查看更多