关于php中的switch语句 报错
ringa_lee
ringa_lee 2017-04-11 10:19:59
0
9
568
switch($rank)
        {
            case 1:
                $speed = 50;
            break;
            case 2:
                $speed = 48;
            break;
            case 3:
                $speed = 46;
            break;
            case 4:
                $speed = 44;
            break;
            case 5:
                $speed = 42;
            break;
            case 6:
                $speed = 40;
            break;
            case 7:
                $speed = 39;
            break;
            case 8:
                $speed = 38;
            break;
            case 9:
                $speed = 37;
            break;
            case 10:
                $speed = 36;
            break;
            case 21 > '$rand' >10:
                $speed = 35;
            break;
            case 31 > '$rand' > 20:
                $speed = 34;
            break;
            case 41 > '$rand' > 30:
                $speed = 32;
            break;
            case 71 > '$rand' > 50:
                $speed = 31;
            break;
            case 101 > '$rand' > 70:
                $speed = 30;
            break;
            case 201 > '$rand' > 100:
                $speed = 29;
            break;
            case 301 > '$rand' > 200:
                $speed = 28;
            break;
            case 401 > '$rand' > 300:
                $speed = 27;
            break;
            case 501 > '$rand' > 400:
                $speed = 26;
            break;
}

在运行的时候报错>符号有误 这是什么情况啊

ringa_lee
ringa_lee

ringa_lee

全部回覆(9)
刘奇

首先要说的是,你的逻辑没有错,但是你的基础语法错了。php没有连级这种判断!!!所以将它并列分开判断就可以!!将所有类似【case 21> '$rand' > 10:】这种代码,修改为如下类似模式即可:

case 10 < $rand && $rand < 21
    $speed = 35;
    break;
迷茫

你的代码……问题很多。
只好一一道来:

阶段一:

首先'$rand'是一个字符串变量,他的值就是字符串'$rand',布尔值是true。这个判断条件写错了吧。我猜是想写前面的$rank

之后条件这里要使用&&把条件连起来,因为没有结合的相同优先级的运算符不能连在一起使用,例如 1 < 2 > 1 在PHP是不合法的。
php手册:http://php.net/manual/zh/lang...
所以其实应该写成10 >= $rank && $rank >2

如果连续写,那么至少每个阶段都要加括号,那么就成了case (10 >= $rank) >2,如果$rank = 5,那就变成布尔值true > 2,这是什么鬼……

<?php
if (true > 2) {
    echo "WTF";
} else {
    echo "WTH";
}

if (true == 2) {
    echo "WTF";
} else {
    echo "WTH";
}

你觉得结果会是啥?
这个也是有相关文档的:http://php.net/manual/zh/lang...

阶段二:

来看我简写后的这段代码

echo getSpeedByRank(1);
echo ',';
echo getSpeedByRank(5);
echo ',';
echo getSpeedByRank(11);
echo ',';
echo getSpeedByRank(100);
echo '.';

function getSpeedByRank($rank = 1)
{
    switch($rank)
            {
                case 1:
                    $speed = 1;//(匹配结果A)
                break;
                case 2:
                    $speed = 2;//(匹配结果B)
                break;
                case 10 >= $rank && $rank >2:
                    $speed = 5;//(匹配结果C)
                break;
                case 20 >= $rank && $rank > 10:
                    $speed = 15;//(匹配结果D)
                break;
                default:
                    $speed = 20;//(匹配结果E)
    }
    return $speed;
}

这个运行结果是1,5,15,20.,可以认为$rank匹配了结果ACDE。

那么如果我令$rank = 0,按照上面的猜想,是不是应该匹配到default,即结果E,speed等于20呢?
你可以运行以下,很可惜speed = 5,匹配了C。

为什么会符合$rank = 0时,会switch到case 10 >= $rank && $rank >2?

阶段三

改写上面的代码:

echo getSpeedByRankAsIf(1);
echo ',';
echo getSpeedByRankAsIf(5);
echo ',';
echo getSpeedByRankAsIf(11);
echo ',';
echo getSpeedByRankAsIf(100);
echo ',';
echo getSpeedByRankAsIf(0);
echo '.';

function getSpeedByRankAsIf($rank = 1)
{
    switch(true)
            {
                case $rank == 1:
                    $speed = 1;
                break;
                case $rank == 2:
                    $speed = 2;
                break;
                case 10 >= $rank && $rank >2:
                    $speed = 5;
                break;
                case 20 >= $rank && $rank > 10:
                    $speed = 15;
                break;
                default:
                    $speed = 20;
    }
    return $speed;
}

结果是:1,5,15,20,20.

阶段二中,$rank = 0时,会switch到case 10 >= $rank && $rank >2的理由,就是$rank = 0,$rank的布尔值是false;case条件case 10 >= 0 && 0 > 2为false,(false == false)就为true,所以会匹配到这个条件。

综上

你可以理解为,switch($a) case ($b): /*code_b*/ break; case ($c): /*code_c*/ break; default: /*code_default*/其实可以理解为:

if ($a == $b) {
    /*code_b*/
} elseif ($a == $c) {
    /*code_c*/
} else {
    /*code_default*/
}

注意break的存在,如果没有break,那么这个if就更复杂了,会一直向下匹配到所有匹配条件,用if就难写了。

迷茫

先去看看php官方文档吧。case 表达式可以是任何求值为简单类型的表达式,即整型或浮点数以及字符串。不能用数组或对象,除非它们被解除引用成为简单类型。
php switch语法

洪涛

echo '$rand' 看一下是什么值。

Peter_Zhu

dacuole

小葫芦

这问题,你其实该去看文档,一行一行的看

伊谢尔伦

你这是哪里学来的用法,谁教过你case里能这么写了?

黄舟

对呀 case后怎么还有比较运算符啊

小葫芦

case后面没法支持运算符

熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板
關於我們 免責聲明 Sitemap
PHP中文網:公益線上PHP培訓,幫助PHP學習者快速成長!