带有in_array()和range()的PHP switch()无法正常工作

Cer*_*ira 3 php function

我正在尝试创建一个函数,在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";
    }   
}
Run Code Online (Sandbox Code Playgroud)

结果是

NE
,但它应该是
N
.

谁能解释为什么,以及如何解决它?

谢谢

编辑1

建立我在代码中出错,条件应该是:

(...)
swich(true) {
(...)
Run Code Online (Sandbox Code Playgroud)

这是一种低效的做事方式:我发现如果我尝试的话

echo rosaventos("0");
Run Code Online (Sandbox Code Playgroud)

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

N
?!?!

mar*_*rio 6

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

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

$grau = 100;
$compass = $dir[floor( ($grau + 22.5) / 45 )];
Run Code Online (Sandbox Code Playgroud)