2014-03-27 41 views
-4

當睏倦看看PHP切換開關紅寶石後..PHP開關的麻煩

更新3(答案)以下

見問題。這是我的錯誤。好吧:) 。在PHP中。用他的動態類型轉換(false - >(int)false-> 0:這裏我得到0等於我的'>=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???!!!!!!!!!!!!!!!! 

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 請說明一下,這是什麼?!

UPDATE 1 不,男人,我不瘋狂!所有必須工作。循環僅用於演示這種奇怪的行爲。如果0(零)< 16,$case務必等於<16。沒有????????

UPDATE 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 
+4

您的開關/案例邏輯沒有多大意義。您正在使用每個'case'語句,如'if'語句,而不是使用該開關。 –

+2

爲什麼你在使用開關???因爲你看到你在看什麼http://3v4l.org/Z2EjY。不奇怪。停止濫用switch語句,並且您沒有這個問題。 – PeeHaa

+0

你混合'如果'與'開關' – Peter

回答

1

表達($item>=17) && ($item<=20)的計算結果爲0,作爲$item值爲0 開關-case語句將僅僅匹配值爲$item,值爲case。 所以,你的代碼,在第一種情況下,相當於

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語句。

開關語句將條件與switched變量(在您的案例中爲item)進行比較,因此它的計算結果爲true,並且它輸入切換條件並在那裏將其切斷。

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