php Switch的一个注意点
2018-07-23
public function formatTime($timestamp) {
$now = time();
$diff = $now - $timestamp;
switch ($diff) {
case $diff < 60:
$re = '1分钟';
break;
case $diff < 60 * 60:
$re = strval(intval($diff / 60)) . '分钟';
break;
case $diff < 60 * 60 * 48:
$re = strval(intval($diff / (60 * 60))) . '小时';
break;
default:
$re = strval(intval($diff / (60 * 60 * 24))) . '天';
break;
}
return $re;
}
当时间戳是time()的时候,diff为0,想的得到的结果应该是返回1分钟,结果却返回了0天。
问题的原因就是switch case在执行的流程是 switch 位置的条件和 case 位置的条件做比较,再继续执行程序。
a.当$diff大于0时,switch位置的条件为“真” true,然后用true 和 case 位置的条件作比较。这时程序是没有问题的,因为只要case位置的条件为true语句就跳出了。
b.当$diff等于0时,就需要主要了。这个时候switch位置的条件为“假” false,语句继续执行的时候,只有当 case 位置的条件也为false 程序才会执行 case 冒号位置后的程序。而事实是 case 位置的所有调教都为“真”,所以最终的结果是执行default冒号后的语句。
这种情况将switch($diff)变为switch(true)就好了