PHP切换麻烦

时间:2014-03-27 21:42:41

标签: php switch-statement

  

当U困了,看看Ruby切换后的PHP开关..

更新3(回答)

请参阅下面的问题。这是我的错。行:) 。在PHP中。通过他的动态类型转换(false-&gt;(int)false-&gt; 0:这里我得到0等于我的'>=17_<=20')并且在这种特定情况下隐含了构造switch的行为( switch( ZERO ) { case (true) break; case (false) break;})。从强类型语言的角度看,这种行为看起来很奇怪。谢谢大家!!

因此,请帮忙! 我注意到了一个奇怪的行为&#34;检查&#34;一页上的复选框(选择年龄组)。在数据库中,如果用户选中了<16 - 字段age等于0(零)。我开始看到&#34;检查&#34;的逻辑。找到下一个:

   $item = 0; //!!!!!!!
   switch($item){
       case ($item<=16):
         $case = '<16';
         break;
       case ( ($item>=17) && ($item<=20)):
         $case = '>=17_<=20';
         break;
       case ( ($item>=21) && ($item<=25)):
         $case = '>=21_<=25';
         break;
   }
   echo $item.' '.$case.'<br/>';

输出

 0 >=17_<=20 // HOW???!!!!!!!!!!!!!!!!

TEST

  $range = range(-5,5);

  foreach($range as $item){

      switch($item){
          case ($item<=16):
                  $case = '<16';
                  break;
          case ( ($item>=17) && ($item<=20)):
                  $case = '>=17_<=20';
                  break;
          case ( ($item>=21) && ($item<=25)):
                  $case = '>=21_<=25';
                  break;
         }

         echo $item.' '.$case.'<br/>';
     }

// OUTPUT

 -5 <16
 -4 <16
 -3 <16
 -2 <16
 -1 <16
 0 >=17_<=20 // WHY???????!!!!!!!!!!!!!!
 1 <16
 2 <16
 3 <16
 4 <16
 5 <16

http://3v4l.org/jbfng 请解释一下,这是什么?!

更新1 不,男,我不疯了!所有必须工作。循环仅用于演示这种奇怪的行为。如果0(零)&lt; 0 16,$case必须等于<16。 NO ????????

更新2 老实说,我不明白弊端。确定。

    $item = 0;
    if (($item>=17) && ($item<=20)){ // false
        // never for  <17 & >20
    }

    item = 0;
    $checking  = (($item>=17) && ($item<=20)); // false
    if ($checkig){
        // never for  <17 & >20
    }

    item = 0;
    $checkig = (($item>=17) && ($item<=20)) ? true : false; // false
    if ($checkig){
         // never for  <17 & >20
    }      

    $item = 0;
    switch($item){
       case ( ($item>=17) && ($item<=20)): // false
          // never for  <17 & >20
          break;
    }

一切正常。它仅在 EQUALS ZERO 时才有效。或者你想说,OUTPUT( Test2 ) - 它的正常行为???感谢。

TEST 2

      $range = range(-5,47);
           //var_dump($range);

            foreach($range as $item){
                  switch($item){
                      case ($item<=16):
                            $case = '<16';
                            break;
                      case ( ($item>=17) && ($item<=20)):
                            $case = '>=17_<=20';
                            break;
                      case ( ($item>=21) && ($item<=25)):
                            $case = '>=21_<=25';
                            break;
                      case ( ($item>=26) && ($item<=35)):
                            $case = '>=26_<=35';
                            break;
                      case ( ($item>=36) && ($item<=45)):
                             $case = '>=36_<=45';
                             break;
                       case ( ($item>=46)):
                             $case = '>=46';
                             break;
                   }

                    echo $item.' '.$case.'<br/>';
           }

// OUTPUT

-5 <16
-4 <16
-3 <16
-2 <16
-1 <16
0 >=17_<=20 // WHY ?
1 <16
2 <16
3 <16
4 <16
5 <16
6 <16
7 <16
8 <16
9 <16
10 <16
11 <16
12 <16
13 <16
14 <16
15 <16
16 <16
17 >=17_<=20
18 >=17_<=20
19 >=17_<=20
20 >=17_<=20
21 >=21_<=25
22 >=21_<=25
23 >=21_<=25
24 >=21_<=25
25 >=21_<=25
26 >=26_<=35
27 >=26_<=35
28 >=26_<=35
29 >=26_<=35
30 >=26_<=35
31 >=26_<=35
32 >=26_<=35
33 >=26_<=35
34 >=26_<=35
35 >=26_<=35
36 >=36_<=45
37 >=36_<=45
38 >=36_<=45
39 >=36_<=45
40 >=36_<=45
41 >=36_<=45
42 >=36_<=45
43 >=36_<=45
44 >=36_<=45
45 >=36_<=45
46 >=46
47 >=46

3 个答案:

答案 0 :(得分:1)

表达式($item>=17) && ($item<=20)的计算结果为0,因为$item的值为0。 switch-case语句仅匹配$item的值与case值。 因此,您的代码在第一种情况下等同于

switch($item){
       case (1):
         $case = '<16';
         break;
       case ( 0):
         $case = '>=17_<=20';
         break;
       case ( 0):
         $case = '>=21_<=25';
         break;
 }

答案 1 :(得分:0)

您有错误,因为“0”的计算结果为false。试试这个:

<?
  echo 0==(0>=17) && (0<=20)); //true
?>

这是因为==的右侧评估为false0==falsetrue,因此您在switch语句中遇到了这种情况。

Switch语句将条件与switched变量(在您的情况下为item)进行比较,因此它的计算结果为true,然后输入切换条件并在那里将其分解。

答案 2 :(得分:0)

你可能不应该在这里使用开关。使用此:

$range = range(-5,5);

foreach($range as $item){
    if ($item<=16)
        $case = '<16';
    else if ( ($item>=17) && ($item<=20))
        $case = '>=17_<=20';
    else if( ($item>=21) && ($item<=25))
        $case = '>=21_<=25';


     echo $item.' '.$case.'<br/>';
 }