php 切换第一种情况无法正常工作
php switch first case not working properly
我有这个函数,当 $time
= 0
时执行第一种情况
function time_spended($time){
switch($time){
case $time > (60*60*24*365):
$time /= (60*60*24*365);
return number_format($time, 2, '.', ',') . " year" . ($time > 1 ? "s":"");
break;
case $time > 60*60*24:
$time /= 60*60*24;
return number_format($time, 2, '.', ',') . " day" . ($time > 1 ? "s":"");
break;
case $time > 60*60:
$time /= 60*60;
return number_format($time, 2, '.', ',') . " hour" . ($time > 1 ? "s":"");
break;
case $time > 60:
$time /= 60;
return number_format($time, 2, '.', ',') . " minute" . ($time > 1 ? "s":"");
break;
default:
return number_format($time, 2, '.', ',') . " seconds";
}
}
例如:
echo time_spended(0); // 0.00 year
而不是:
0.00 seconds
switch
中的条件应在括号中。
function time_spended($time){
switch($time){
case ($time > (60*60*24*365)):
$time /= (60*60*24*365);
return number_format($time, 2, '.', ',') . " year" . ($time > 1 ? "s":"");
break;
case ($time > 60*60*24):
$time /= 60*60*24;
return number_format($time, 2, '.', ',') . " day" . ($time > 1 ? "s":"");
break;
case ($time > 60*60):
$time /= 60*60;
return number_format($time, 2, '.', ',') . " hour" . ($time > 1 ? "s":"");
break;
case ($time > 60):
$time /= 60;
return number_format($time, 2, '.', ',') . " minute" . ($time > 1 ? "s":"");
break;
default:
return number_format($time, 2, '.', ',') . " seconds";
}
}
函数returns 0.00 year
(换句话说,第一个case
的结果),因为$time = 0
在switch
的计算结果为 false
,并且由于 $time > (60*60*24*365)
是 true
,它 returns 来自第一个分支,viz:
[0 == true] => [false == true] => [false]
要使其正常工作,您应该使用 switch(true)
而不是 switch($time)
,它应该按如下所示的方式工作:
[true == (0 > 60*60*24*365)] => [true == true] => [false]
您没有正确使用 switch
语句。 switch
语句用于在多个值中进行选择。更 suitable/clear 的方法是使用 elif
来实现逻辑:
function time_spended($time){
if($time > (60*60*24*365)) {
//...
} elseif ($time > 60*60*24) {
// ...
} elseif($time > 60*60) {
// ...
} elseif($time > 60) {
//...
} else {
return number_format($time, 2, '.', ',') . " seconds";
}
}
switch
的正确示例是:
switch($currentDayOfTheWeek){
case 'Monday': // ...
case 'Tuesday': // ...
case 'Wednesday: // ...
// and so on
default: // cause it's goo practice to have a default branch
}
编辑: 感谢 Mike 的 elif
评论 :)
我有这个函数,当 $time
= 0
function time_spended($time){
switch($time){
case $time > (60*60*24*365):
$time /= (60*60*24*365);
return number_format($time, 2, '.', ',') . " year" . ($time > 1 ? "s":"");
break;
case $time > 60*60*24:
$time /= 60*60*24;
return number_format($time, 2, '.', ',') . " day" . ($time > 1 ? "s":"");
break;
case $time > 60*60:
$time /= 60*60;
return number_format($time, 2, '.', ',') . " hour" . ($time > 1 ? "s":"");
break;
case $time > 60:
$time /= 60;
return number_format($time, 2, '.', ',') . " minute" . ($time > 1 ? "s":"");
break;
default:
return number_format($time, 2, '.', ',') . " seconds";
}
}
例如:
echo time_spended(0); // 0.00 year
而不是:
0.00 seconds
switch
中的条件应在括号中。
function time_spended($time){
switch($time){
case ($time > (60*60*24*365)):
$time /= (60*60*24*365);
return number_format($time, 2, '.', ',') . " year" . ($time > 1 ? "s":"");
break;
case ($time > 60*60*24):
$time /= 60*60*24;
return number_format($time, 2, '.', ',') . " day" . ($time > 1 ? "s":"");
break;
case ($time > 60*60):
$time /= 60*60;
return number_format($time, 2, '.', ',') . " hour" . ($time > 1 ? "s":"");
break;
case ($time > 60):
$time /= 60;
return number_format($time, 2, '.', ',') . " minute" . ($time > 1 ? "s":"");
break;
default:
return number_format($time, 2, '.', ',') . " seconds";
}
}
函数returns 0.00 year
(换句话说,第一个case
的结果),因为$time = 0
在switch
的计算结果为 false
,并且由于 $time > (60*60*24*365)
是 true
,它 returns 来自第一个分支,viz:
[0 == true] => [false == true] => [false]
要使其正常工作,您应该使用 switch(true)
而不是 switch($time)
,它应该按如下所示的方式工作:
[true == (0 > 60*60*24*365)] => [true == true] => [false]
您没有正确使用 switch
语句。 switch
语句用于在多个值中进行选择。更 suitable/clear 的方法是使用 elif
来实现逻辑:
function time_spended($time){
if($time > (60*60*24*365)) {
//...
} elseif ($time > 60*60*24) {
// ...
} elseif($time > 60*60) {
// ...
} elseif($time > 60) {
//...
} else {
return number_format($time, 2, '.', ',') . " seconds";
}
}
switch
的正确示例是:
switch($currentDayOfTheWeek){
case 'Monday': // ...
case 'Tuesday': // ...
case 'Wednesday: // ...
// and so on
default: // cause it's goo practice to have a default branch
}
编辑: 感谢 Mike 的 elif
评论 :)