PHP开关麻烦[闭合]

问题描述 投票:-4回答:3

当U是困了,看看PHP开关红宝石开关以后。

更新3(答案)

请参见下面的问题。它我的错误。好吧:) 。在PHP。随着他的动态类型转换(假 - >(int)的假> 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/>';

OUTPUT

 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(零)<16,$case必须是等于<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;
    }

一切工作正常。它只有当等于零。或者你想说,该输出(的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/>';
           }

//输出

-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
php switch-statement
3个回答
1
投票

表达($item>=17) && ($item<=20)的计算结果为0,如$item的值是0的开关情况下的声明将仅仅匹配$itemcase值的值。所以,你的代码,在第一种情况下,相当于

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

0
投票

你有错误,因为“0”的计算结果为假。尝试这个:

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

这是因为==的右边的计算结果为false0==falsetrue所以你打的条件在switch语句。

switch语句比较与switched可变的条件(在你的情况item),所以它的计算结果为真实的,并将其输入开关状态,并打破它。


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/>';
 }
© www.soinside.com 2019 - 2024. All rights reserved.