我正在尝试制作一个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,无论如何我都无法对其进行编辑。
答案 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,但我想我需要解释更多)虽然它不是预期用途,但它是一种聪明而可靠的非正则表达式技术,因为您的时间单位子字符串(h
,m
,s
)在具有统一含义的开发阶段子字符串列表中找不到 。这意味着,即使您有具有特殊含义的非数字子字符串,也仍然可以仅根据数字值正确地评估比较。
特殊子串的顺序:
dev
alpha
或a
beta
或b
RC
或rc
#
pl
或p
此功能是一种三向比较工具-类似于飞船操作员。它还接受第三个参数来命令它返回布尔响应。如果第一个字符串“大于”第二个字符串,则使用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