2011-08-13 141 views
1

我有以下函數可以正常工作,除了當您使用輸入值0時。我試着四處搜尋,看看0是否等同於NULL或者我做錯了什麼。switch語句不等於零?

當輸入零時,它會輸出超過20的高級值。任何人都可以解釋嗎?謝謝

我打算使開關等於0-10,11-20,21-30,31-40,41+,但對於這個例子,我只是使用兩種情況。由於

**編輯我也希望值時,其20 :)

function strengthPlan($data) { 

    $data = (int) $data; 
    switch($data) { 
     case($data <= 19): 
      $result = 'standard strength'; 
      break; 
     case($data >= 20): 
      $result = 'advanced strength'; 
      break; 
    } 
    return $result; 

} 

echo strengthPlan(0); 
+5

你的交換機的理解聲明是錯誤的! –

+1

長度*準確* 20會發生什麼?一個PHP通知肯定不會:*未定義的變量:result *! – Shi

+0

@Cicada你能解釋一下嗎?我想正確理解它,謝謝 – Drewdin

回答

12

你的邏輯是不正確。 Switch語句正在檢查是否相等。您的代碼正在檢查$data是否等於TRUEFALSE

case($data < 20): 

將評估爲:

case(TRUE): 

因爲0 < 20

由於0不等於TRUE而是FALSE(轉換後),運行第二種情況。

基本上,您不能使用switch case<>,但僅限於==

+0

我認爲,開關評估每個案件的輸入經文,所以例如,如果我輸入6和(6 <20)是真的比該案件將被選中。我應該遠離使用這種方式嗎?謝謝 – Drewdin

+0

+1以徹底解釋爲什麼使用不正確。 – Jonah

+0

@德魯丁:它'意外'的作品,因爲任何數字將被轉換爲'真',除了'0',因爲如果你明白我的意思,那麼這個數字'不是什麼'。所以在'0'以外的情況下,它總是執行'TRUE'的情況,這也是你所期望的。我會用'? :'運營商雖然,由@Jonah張貼。 – pimvdb

4

這不是如何切換語句。他們將該案例與您提供給switch的價值進行比較。下面是你應該做的,而不是:

function strengthPlan($length) { 
    return $length >= 20 ? 'advanced strength' : 'standard strength'; 
} 

如果你打算使用更多的條件,然後使用if...elseif聲明如下:

function strengthPlan($length) { 
    if  ($length < 5) return 'micro strength'; 
    elseif ($length < 10) return 'tiny strength'; 
    elseif ($length < 15) return 'small strength'; 
    elseif ($length < 20) return 'standard strength'; 
    elseif ($length < 30) return 'advanced strength'; 
    else     return 'super strength!!!!!'; 
} 

直到碰到了一些將涓滴每個條件它在內部。另外,您也可以使用排序這樣的查找表的風格:

function strengthPlan($length) { 
    $plans = array(
     1   => 'super strength!!!!!', 
     $length < 30 => 'advanced strength', 
     $length < 20 => 'standard strength', 
     $length < 15 => 'small strength', 
     $length < 10 => 'tiny strength', 
     $length < 5 => 'micro strength', 
    ); 
    return $plans[1]; 
} 

有一個關於這個在這裏討論:http://forums.devnetwork.net/viewtopic.php?f=50&t=113253

+0

+1同意;當單行三元運營商符合法案時,濫用轉換聲明。 –

+2

+1如果我可以(達到投票限制),但對於邊緣情況'20',這是返回'標準強度',而原始代碼沒有。 – pimvdb

+0

@pimvdb原來沒有返回_anything_;)但我會補充說,無論如何,謝謝。 – Jonah

0

在這種情況下使用交換機是錯誤的

用這個

http://sandbox.phpcode.eu/g/b4053.php

<?php 
function strengthPlan($data) { 
    return ($data > 20) ? 'advanced strenght' : 'standard strenght'; 
} 

echo strengthPlan(0);