2011-07-25 59 views
0

的什么,我试图做会更明确的样本:与PHP开关奇怪beahviour?

var_dump($opti_point); //int 0 

    if ($opti_point>=0 && $opti_point < 25) echo 'good';//echoing good 

    switch ($opti_point) { 

     case ($opti_point>= 0 && $opti_point < 25): 
      $test = 0; 
      break; 

     case ($opti_point >= 25 && $opti_point < 50): 
      echo 'we are in this case'; // This case is called ! 
      $test = 2; 
      break; 

     default: 
      test = 0; 
      break; 
    } 

有没有什么窍门吗?

THX

+3

你不能把计算的CASE语句。 –

+0

@Fabrizio D.,你可以。为什么不? 'case 5 + 5:$ result = 10;' – Nemoden

+0

@Nemoden你是对的,你可以,但我的目的是阻止在CASE中添加逻辑。 –

回答

1

使用TRUE您还没有比较你认为你是在比较。这是我认为你想要的代码。

var_dump($opti_point); //int 0 

if ($opti_point>=0 && $opti_point < 25) { 
    $test = 0; 
    echo 'You are now here!'; 
} elseif ($opti_point >= 25 && $opti_point < 50) { 
    $test = 2; 
} else { 
    test = 0; 
} 

在你的例子中,你正在比较逻辑语句的结果...

($opti_point>=0 && $opti_point < 25) // true 

为$ opti_point

0 // false 

值那么PHP实际上是将你的想法在一个整数到一个布尔值,它与条件语句的结果进行比较。

+0

Thx所有的答案我今天学到东西!我会用这个解决方案(我做过的第一件事,但我判断它冗长,并尝试切换一个!)... Thx – krifur

3

你不能把里面的比较“的情况下”不幸的是...... 开关仅用于当值可以有一个有限数量的值,像这样的一个:

switch ($val) { 
    case 1: 
    echo "Got 1"; 
    break; 
    case 2: 
    echo "Got 2"; 
    break; 
    default: 
    echo "Got invalid value"; 
} 

一解决方法是使用:

switch (true) { 
    case ($opti_point>= 0 && $opti_point < 25): 
     $test = 0; 
     break; 

    case ($opti_point >= 25 && $opti_point < 50): 
     echo 'we are in this case'; 
     $test = 2; 
     break; 

    default: 
     test = 0; 
     break; 
} 

这将工作,但就是有点难看......

而且,你错过了在echo we are in this case';一个单引号应该是echo 'we are in this case';

您应该使用的,如果不是=)

+0

如果有一吨的条件,我不会轻哼它的丑陋。在这种情况下,只有3,但我必须同意如果/其他人可能更干净。但是如果是+ = 4条件,id使用开关。 – prodigitalson

1

我认为这是使用switch语句一个非常糟糕的方式,你不应该在案件中放置有条件的句子......事实上,我确信这在其他语言中是非法的,我不确定它应该在PHP中工作。使用一定数量的级联的if-else条件,而不是:

if ($i == 0) { 
    echo "i equals 0"; 
} elseif ($i == 1) { 
    echo "i equals 1"; 
} elseif ($i == 2) { 
    echo "i equals 2"; 
} 
3

你需要,如果你做对比liek,在案件的switch参数更改为falsetrue

1

您对switch-case的工作方式存在误解。 Case是不是测试你的表达是布尔真实的!

它将它的值与'switch'值进行比较!

下面是一个说明:

$opti_point>= 0 && $opti_point < 25演算值为真,其整数表示为1并且由于PHP可以处理它自己的类型,它地调真为1,并在开关,它是0

它与值进行比较

$opti_point >= 25 && $opti_point < 50计算结果为假是0作为整数,所以...这是你的情况;)

1

我会去真正的代码与您

var_dump($opti_point); //int 0 , or false --- you should use TRUE 

    if ($opti_point>=0 && $opti_point < 25) echo 'good';//echoing good 

    switch ($opti_point) { // chose the case that is $opti_point (0 or false) 

     case ($opti_point>= 0 && $opti_point < 25): // true, so go to next 
      $test = 0; 
      break; 

     case ($opti_point >= 25 && $opti_point < 50): //false si this is the wan I pick 
      echo 'we are in this case'; // This case is called ! 
      $test = 2; 
      break; // ingore the rest 

     default: 
      test = 0; 
      break; 
    } 

你应该在开关

1

如果这是再确切的代码试试这个

var_dump($opti_point); //int 0

if ($opti_point>=0 && $opti_point < 25) echo 'good';//echoing good 

switch ($opti_point) { 

    case ($opti_point>= 0 && $opti_point < 25): 
     $test = 0; 
     break; 

    case ($opti_point >= 25 && $opti_point < 50): 
     echo 'we are in this case'; // This case is called ! 
     $test = 2; 
     break; 

    default: 
     $test = 0; 
     break; 
}