2010-12-21 78 views
6

下面的例子是從http://php.net/manual/de/control-structures.switch.php問題帶有條件開關

<?php 
$totaltime = 0; 
switch ($totaltime) { 

    case ($totaltime < 1): 
     echo "That was fast!"; 
     break; 

    case ($totaltime > 1): 
     echo "Not fast!"; 
     break; 

    case ($totaltime > 10): 
     echo "That's slooooow"; 
     break; 
} 

?> 

的提取物我期望的結果作爲「那是快」。但實際結果是「不快!」。如果有人能解釋我爲什麼會很好?

但是,如果我添加另一個案例,case 0: echo "That was super fast!".然後它正確迴應。即「那太快了!」。請幫助我如何使用條件切換語句。

編輯: -

謝謝你的迴應。我能夠通過modifyong開關($ TOTALTIME),以克服上述問題進行切換(1)

+0

=交換機僅評估一次,你似乎誤用在它上面 – ajreal 2010-12-21 11:31:19

回答

10

case ($totaltime < 1):意味着1到PHP(即公式返回true)

case ($totaltime > 1):意味着0到PHP(即公式返回false)

由於$totaltime是0,你得到的輸出

換句話說PHP比較$totaltime的比較結果。關於OP編輯

編輯:

你需要擺脫switch()語句來的。您只能用它來輕鬆地比較不同的值,並且不會使用其他表達式。

我的意思是什麼毛病

<?php 
$totaltime = 0; 

if ($totaltime < 1) { 
    echo "That was fast!"; 
} else if ($totaltime > 10) { 
    echo "That's slooooow"; 
} else if ($totaltime > 1) { 
    echo "Not fast!"; 
} 

?> 

編輯:請注意,我打開最後兩個if語句,使之真正發揮作用。

+0

- 根本沒有錯。但我有近20個值,我需要比較和顯示錯誤。所以我認爲開關會讓它更容易取代IF。 – satya 2010-12-21 11:59:36

+0

@lucky:但你確實明白它用一組'if()'語句更可讀?這也意味着代碼更少,導致錯誤的可能性更小(儘管這更多的是一般規則)。 – sjngm 2010-12-21 12:04:57

1

這似乎是一個布爾轉換問題。

第一個case語句將評估爲0以外的任何值,所以不會發生。

但第二個case語句將評估爲false,它應該是0,它等於您設置$ totaltime的值。

1

幸運,

PHP開關與一系列IF語句相同。這些案例評估爲:

if($totaltime == ($totaltime < 1)) { 
    echo "That was fast!"; 
    break; 
} 
if($totaltime == ($totaltime > 1)) { 
    echo "Not fast!"; 
    break; 
} 
... 

明顯地0 == false爲第二個IF是真的,因此結果。

謝謝, Vikas。

2

您不要在這樣的語句中使用條件語句,而不是直觀地使用它。這是發生了什麼:

case ($totaltime < 1): // Evaluates to 1. $totaltime is not 1, so no match. 
    case ($totaltime > 1): // Evaluates to 0. $totaltime is 0, so match. 

基本上你想使用else if結構爲switch結構,但功能是不存在的。條件不會以您期望的方式(在if區塊中的方式)進行評估,它們只是尋找第一個case區塊,該區塊等於switch區塊中正在測試的值。

0

其他人已經提到了爲什麼會發生這種情況(在案例聲明中濫用條件),但他們沒有提供替代方案。開關是爲了覆蓋特定的參數,如{0,1,2,3..100,101}等。它分離出特定的參數或範圍,而不是執行簡單的if/else(就像您使用過的那樣)。你可以重寫你的論點,把它關閉,但:

switch ($totaltime) { 

    case (0): 
     echo "That was fast!"; 
     break; 

    case (1..PHP_INT_MAX): 
     echo "Not fast!"; 
     break; 

    default: 
     echo "That's slooooow"; 
     break; 
} 

這裏..允許覆蓋的範圍內,所以任何從1到整數的最大值由殼體覆蓋。 0被明確處理,所有其他處理(默認情況下覆蓋了< 0)。

+0

+1,謝謝你的回覆。這是我正在尋找的。當$ totaltime = 10;它導致「這是slooooow」;而不是「不快!」; – satya 2010-12-21 12:03:29

+0

-1 PHP不支持您在開關/外殼中使用的範圍。你的'case(1..PHP_INT_MAX):'實際上會返回連接值1和PHP_INT_MAX(12147483647)。我想你最近做了太多的Pascal,並且混合了PHP和Pascal語法:p。 – wimvds 2010-12-21 12:50:06

+0

@wimvds:感謝您的評論和信息。我想我最近在其他語言上花費了太多時間。 – 2010-12-21 12:56:07

2

討厭已經回答的帖子,但我很困惑沒有人觸及開關(真)方法。

有兩種方法沒有真正的世界速度優勢

在某些情況下,交換機要快,別人如果也較快,但只能通過一微秒 的分數(48.16微秒VS 49.11微秒切換得更快了比如果)。

編輯

現在我看到OP也一樣...

<?php 
for ($totaltime = 0; $totaltime < 11; $totaltime += 0.5) { 
    switch (true) { 
     case ($totaltime < 1): 
      echo $totaltime . " That was fast!\n"; 
      break; 
     case ($totaltime < 10): 
      echo $totaltime . " Not fast!\n"; 
      break; 
     default: 
      echo $totaltime . " That's slooooow\n"; 
      break; 
    } 
} 

結果:https://3v4l.org/d71lZ

0 That was fast! 
0.5 That was fast! 
1 Not fast! 
1.5 Not fast! 
2 Not fast! 
2.5 Not fast! 
3 Not fast! 
3.5 Not fast! 
4 Not fast! 
4.5 Not fast! 
5 Not fast! 
5.5 Not fast! 
6 Not fast! 
6.5 Not fast! 
7 Not fast! 
7.5 Not fast! 
8 Not fast! 
8.5 Not fast! 
9 Not fast! 
9.5 Not fast! 
10 That's slooooow 
10.5 That's slooooow