Php 做一个if语句,理解其中的;“剩下的时间”;格式更大

Php 做一个if语句,理解其中的;“剩下的时间”;格式更大,php,if-statement,time,timer,comparison,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

我试图做一个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,我无论如何都无法编辑它。

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

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

在这里,我们通过分隔符
将每次划分为三部分。这将获得各个部分,但我们仍然需要获取整数值,这正是我们感兴趣的。我们可以使用
inval()
,因为数字是第一位的。一旦我们有了这三个部分,我们可以将它们放入
HH:mm:ss
格式,或者你可以将它们相乘到以秒为单位的所有值,然后将它们相加(第一个是小时,第二个是分钟,第三个是秒)。在这里,我们没有这样做,我们将它们以可读的格式粘在一起,并使用
strotime()
将它们转换为时间戳——在完成所有这些工作之后,我们终于可以比较它们了

$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";
}
  • 现场演示

你的帖子建议所有三个时间单位都是可用的。所以只要按你的意愿创建两个数字数组。PHP7的spaceship操作符将在处理两个数值时进行数值比较。它将根据需要从左到右比较元素

不需要进行时间分析,因为时间单位是从大到小排序的

代码:()

如果您只需要写一个
-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
}
输出:

-1 -> less
left is less than or equal to right

php函数
version\u compare()
类似于
strcmp()
,但将数字作为单个单元进行比较。由于(实际上)转换字符,它有一些副作用,但我认为这并不重要:

所以

变成

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

小时数能否大于23:59:59?编辑!是的,它们可以更大。但它不是一个时钟,它只是时间离开。所以它基本上可以是45h:59m:59s,例如,如何生成这些字符串?您可以创建datetime对象或使用时间戳,而不是像那样检查它们。我无法编辑字符串。它来自API。请尝试php函数
version\u compare()
。它有一些副作用(转换字符),但我认为,它在这里会有所帮助。注意到一个问题。如果左计时器为例如0h:59m:0s,右计时器为0h:30m:0s,则假定左计时器小于右计时器。我无法复制您的问题:请在两个变量上使用
var\u dump()
来调查字符串中是否有任何隐藏/意外字符。这非常非常聪明。很好的建议。
left is less than or equal to right
if('6h : 27m : 45s' > '6h : 27m : 15s')
if( version_compare('6h : 27m : 45s','6h : 27m : 15s') > 0 )