2010-02-13 54 views
6

对不起,也许愚蠢的问题,但我有一个情况下,当我有一些值为0(零)的int变量的巨大问题。0在开关柜中?

  switch ($starost_vozila){ 
       case (0): 
        switch ($podaci['tip_motora']){ 
         case ("motor1"): 
          $eko_taksa = 485; 
         break; 
         case ("motor2"): 
          $eko_taksa = 243; 
         break; 
         case ("motor3"): 
          $eko_taksa = 121; 
         break; 
         case ("motor4"): 
          $eko_taksa = 194; 
         break; 
        } 
       break; 
       case ($starost_vozila < 6): 
        switch ($podaci['tip_motora']){ 
         case ("motor1"): 
          $eko_taksa = 485; 
         break; 
         case ("motor2"): 
          $eko_taksa = 243; 
         break; 
         case ("motor3"): 
          $eko_taksa = 121; 
         break; 
         case ("motor4"): 
          $eko_taksa = 194; 
         break; 
        } 
       break; 
       case ($starost_vozila > 5 && $starost_vozila < 11): 
        switch ($podaci['tip_motora']){ 
         case ("motor1"): 
          $eko_taksa = 667; 
         break; 
         case ("motor2"): 
          $eko_taksa = 273; 
         break; 
         case ("motor3"): 
          $eko_taksa = 136; 
         break; 
         case ("motor4"): 
          $eko_taksa = 218; 
         break; 
        } 
       break; 

开关继续更多,但这里是我的问题,在这段代码。

如果我不把“案(0)”,并使用此:

case ($starost_vozila >= 0 && $starost_vozila < 6): 

然后就是接下来的情况会以某种方式被激活,它会打印出“$ eko_taksa = 667;”。

当“$ starost_vozila = 0”时,这是所有问题,但是当它是小于6的任何数字比上面这种情况下的工作。

这里的每个变量都是int。除非当“$ starost_vozila = 0”以及当我使用“case($ starost_vozila> = 0 & & $ starost_vozila < 6):”。

我不知道是怎么回事......哦哦

很抱歉,如果这是愚蠢的问题。 :(

+1

// offtopic我个人的建议是命名变量时使用英语单词。例如,我了解他们,但可能大多数访问者 - 不。不过这是一个很好的做法。 Sys Zdrave! :) – anthares 2010-02-13 22:44:08

+0

在类似的情况下,我的头撞在墙上,发现这一点。非常感谢你的提交。 – pal4life 2012-03-27 02:45:39

回答

6

切换案例不需要需要评估的语句。他们采取简单的字符串,布尔或数字进行比较反对

所以说,你有

$x = 0 

switch($x) { 
    case($x < 10): 
    ... 
    break; 
} 

你期待这种情况下运行,但它不能做这里的原因

($x < 10)评估为true 所以你实际上得到的是:

$x = 0 

switch($x) { 
    case true: //!!! 
    ... 
    break; 
} 

0 != true这样的情况下辉LS

你需要使用

if() { 

} else if() { 

} else { 

} 
+0

谢谢!正是我需要找到聆听并使一切变得清晰。 :) – Gavrisimo 2010-02-13 22:51:13

+0

不客气GaVrA – meouw 2010-02-13 23:04:16

+0

感谢您的回应,正如问题中提到的,它值得所有人期望值为0时,所以可以使用开关大小写的所有其他情况下使用,如果其他情况下使用,只有当其0 。 谢谢。 – pal4life 2012-03-27 02:46:34

0

使用开关就像==在“if语句”而不是===(不检查类型)。只有空字符串或NULL会导致整数0 - 除此之外,它们被认为是串0

3

您正在使用switch正确

您的代码被理解是这样的:。

if ($starost_vozila == 0) { 
    switch ($podaci['tip_motora']){ 
     case ("motor1"): 
      $eko_taksa = 485; 
     break; 
     case ("motor2"): 
      $eko_taksa = 243; 
     break; 
     case ("motor3"): 
      $eko_taksa = 121; 
     break; 
     case ("motor4"): 
      $eko_taksa = 194; 
     break; 
    } 
} else if ($starost_vozila == ($starost_vozila < 6)) { //not what you want!!! 
    switch ($podaci['tip_motora']){ 
     case ("motor1"): 
      $eko_taksa = 485; 
     break; 
     case ("motor2"): 
      $eko_taksa = 243; 
     break; 
     case ("motor3"): 
      $eko_taksa = 121; 
     break; 
     case ("motor4"): 
      $eko_taksa = 194; 
     break; 
    } 
} else if ($starost_vozila == ($starost_vozila > 5 && $starost_vozila < 11)) { //not what you want!!! 
    switch ($podaci['tip_motora']){ 
     case ("motor1"): 
      $eko_taksa = 667; 
     break; 
     case ("motor2"): 
      $eko_taksa = 273; 
     break; 
     case ("motor3"): 
      $eko_taksa = 136; 
     break; 
     case ("motor4"): 
      $eko_taksa = 218; 
     break; 
    } 
} 

例如,($starost_vozila < 6)将成为无论是TRUEFALSE$starost_vozila == ($starost_vozila < 6)$starost_vozilaTRUEFALSE进行比较,这不是您想要的。

在这种情况下,我建议使用if/elseif而不是switch。例如:

if ($starost_vozila == 0) { 
    ... 
} else if ($starost_vozila < 6) { 
    ... 
} else if ($starost_vozila > 5 && $starost_vozila < 11) { 
    ... 
}