PHP中使用switch()、in_array()和range()无法正常工作

3
我试图创建一个函数,根据0到360度的角度返回罗盘点,然后找到了这个函数。在角度为0度时它无法正常工作...我不明白为什么这段代码不能运行:
echo rosaventos(0);
function rosaventos($grau,$slim=true){
    switch($grau) {
        case in_array($grau, range(0,22,1)):{
            $prnt = "N";
            break;
        }
        case in_array($grau, range(23,67,1)):{
            $prnt = "NE";
            break;
        }
        case in_array($grau, range(68,112,1)):{
            $prnt = "E";
            break;
        }
        case in_array($grau, range(113,157,1)):{
            $prnt = "SE";
            break;
        }
        case in_array($grau, range(158,202,1)):{
            $prnt = "S";
            break;
        }
        case in_array($grau, range(203,247,1)):{
            $prnt = "SO";
            break;
        }
        case in_array($grau, range(248,292,1)):{
            $prnt = "O";
            break;
        }
        case in_array($grau, range(293,337,1)):{
            $prnt = "NO";
            break;
        }
        case in_array($grau, range(338,360,1)):{
            $prnt = "N";
            break;
        }
        default: {
            $prnt = "-?-";
        }
    }
    if($slim){
        return $prnt;
    }else{
        return $prnt."-Extended";
    }   
}

结果是NE,但应该是N

有人能解释一下为什么吗,怎么修复呢?

谢谢

编辑 1

确认我在代码中犯了错误,条件应该像这样:

(...)
swich(true) {
(...)

这是一种效率低下的做法:

我发现,如果我尝试

echo rosaventos("0");

使用原始代码,结果是正确的
N
?!?

1
case 声明应该只包含静态值,而不是表达式。它们不是 if 条件。 - mario
1
in_array() 返回一个布尔值 truefalse:因此,您在 $grau 上的 switch 语句正在将 $grau 与这些可能的布尔值进行比较;这是一种情况,其中一系列 if... elseif... elseif... 语句很可能是更好的选择;或者使用针对您的范围值数组的查找。 - Mark Baker
消除每个 case 语句周围的花括号:switch($grau) { case in_array($grau, range(0,22,1)): $prnt = "N"; break; case in_array($grau, range(23,67,1)): $prnt = "NE"; break; - John Conde
你可以使用 switch(true) {} 在你的 case 语句中添加比较条件(返回布尔值 true 或 false)。我最近回答了一个类似的问题,我会尝试找到它。 - scrowler
记录一下,就这个特性而言,我不同意@MarkBaker和@mario的观点。在switch语句中使用条件是有效的,没有必要使用if-else块。但我建议像@scrowler提到的那样使用switch(true){ - Christian
显示剩余6条评论
1个回答

8

由于你将角度均匀分配在罗盘点之间,我建议您尝试进行简单的计算和地图查找:

$dir = array("N", "NE", "E", "SE", "S", "SO", "O", "NO", "N");

$grau = 100;
$compass = $dir[floor( ($grau + 22.5) / 45 )];

1
这是一个优雅的解决方案......谢谢 - Cerveira

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接