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 = 0switch 的计算结果为 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]

Example

您没有正确使用 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 评论 :)