【问题标题】:PHP switch trouble [closed]PHP切换麻烦[关闭]
【发布时间】:2014-03-27 21:42:41
【问题描述】:

当你困了,看看Ruby切换后的PHP切换..

更新 3(答案)

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

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

   $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???!!!!!!!!!!!!!!!!

测试

  $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/>';
     }

// 输出

 -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(零)$case 必须等于 &lt;16。没有????????

更新 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;
    }

一切正常。只有当等于零。或者你想说,那 OUTPUT(Test2) - 它的正常行为???谢谢。

测试 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/>';
           }

// 输出

-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

【问题讨论】:

  • 您的开关/案例逻辑没有多大意义。您正在使用每个case 语句,就像if 语句一样,而不是使用开关。
  • 你到底为什么要使用开关???因为你看到你所看到的3v4l.org/Z2EjY。并不奇怪。停止滥用 switch 语句,你就没有这个问题了。
  • 你把ifswitch混在一起
  • 更新问题,请看
  • 您的更新仍然显示您不了解如何使用 swtich/case。将它们切换为 if 语句,就像我在回答中所做的那样。

标签: php switch-statement


【解决方案1】:

表达式 ($item&gt;=17) &amp;&amp; ($item&lt;=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;
 }

【讨论】:

    【解决方案2】:

    您有错误,因为“0”评估为假。试试这个:

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

    这是因为 == 右侧的计算结果为 false 并且 0==falsetrue,因此您在 switch 语句中遇到了该条件。

    Switch 语句将条件与 switched 变量(在您的情况下为 item)进行比较,因此它的计算结果为 true,然后它进入 switch 条件并将其中断。

    【讨论】:

      【解决方案3】:

      您可能不应该在这里使用开关。使用这个:

      $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/>';
       }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2019-02-14
        • 2010-09-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多