使if语句了解哪种“剩余时间”格式更大

时间:2019-12-16 09:51:06

标签: php if-statement time timer comparison

我正在尝试制作一个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,无论如何我都无法对其进行编辑。

3 个答案:

答案 0 :(得分:1)

php函数version_compare()类似于strcmp(),但是将数字作为单个单位进行比较。由于(实际上)转换了字符,它有一些副作用,但是我认为在这里没关系:

所以

if('6h : 27m : 45s' > '6h : 27m : 15s')

成为

if( version_compare('6h : 27m : 45s','6h : 27m : 15s') > 0 )

答案 1 :(得分:0)

这不是最漂亮的方法,但是由于从API返回的数据无法修改,因此必须处理获得的数据。

有几种方法可以做到这一点。一种方法是将时间转换为秒,然后进行比较。另一个是将它们转换为对象-并使用它。 “苦工”是一样的。您必须将数据分为小时,分钟和秒,然后使用它们-比格式Xh : Ym : Zs更有用。

在这里,我们每次用定界符:分成三部分。这样就得到了各个部分-但是我们仍然需要获取我们感兴趣的整数值。我们可以使用inval()来抓取它,因为数字是第一个。一旦有了这三个部分,我们就可以将它们放入HH:mm:ss格式,或者可以将它们乘以秒为单位的所有内容,然后将它们加在一起(第一个是小时,第二个是分钟,第三个是秒) 。这里我们没有这样做,我们将它们以可读的格式粘贴在一起,并使用strtotime()将它们转换为时间戳记-经过所有这些工作,我们终于可以进行比较了!

$time_left = '6h : 27m : 45s';
$time_right = '6h : 27m : 5s';
$parts_left = explode(":", $time_left);
$parts_right = explode(":", $time_right);

$left = intval($parts_left[0]).":".intval($parts_left[1]).":".intval($parts_left[2]);
$right = intval($parts_right[0]).":".intval($parts_right[1]).":".intval($parts_right[2]);

if (strtotime($left) > strtotime($right)) {
    echo 'Timer to the left is bigger';
}

根据编辑后的评论,小时数可以大于24-在这种情况下,您需要将小时和分钟数转换为秒,然后将其加起来。

$time_left = '6h : 27m : 45s';
$time_right = '6h : 27m : 5s';
$parts_left = explode(":", $time_left);
$parts_right = explode(":", $time_right);

$left = intval($parts_left[0]) * 60*60 + intval($parts_left[1])*60 + intval($parts_left[2]);
$right = intval($parts_right[0]) * 60*60 + intval($parts_right[1])*60 + intval($parts_right[2]);

if ($left > $right) {
    echo "Timer to the left is bigger";
}

答案 2 :(得分:0)

您的帖子建议所有三个时间单位始终可用。因此,只需创建两个数字数组即可。 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