2014-09-26 15 views
2

我想比較相同的變量(或表達式)與許多不同的值,並返回一個不同的值,取決於它等於哪個值。我想要做到這一點inline or shorthand,儘可能使用if聲明。是否存在縮寫開關語句(在PHP中)?

採取以下switch聲明:

switch($color_name) { 
    case 'red': 
    case 'blue': 
     $color_type = handlePrimaryColor($in); 
     break; 
    case 'yellow': 
    case 'cyan': 
     $color_type = handleSecondaryColor($in); 
     break; 
    case 'azure': 
    case 'violet': 
     $color_type = handleTertiaryColor($in); 
     break; 
    default: 
     $color_type = null; 
     break; 
} 

我不喜歡寫在任何情況下$color_type =,想找到一種方法,用更少的代碼來做到這一點。

我可以用某種形式的簡寫語法來完成它。下面,我用一個shorthand if statement的值賦給它首先被宣佈在同一個地方的變量:

$color_type = $color_name == 'red' || $color_name == 'blue' 
    ? handlePrimaryColor($color_name) 
    : ($color_name == 'yellow' || $color_name == 'cyan' 
     ? handleSecondaryColor($color_name) 
     : ($color_name == 'azure' || $color_name == 'violet' 
      ? handleTertiaryColor($color_name) 
      : null 
     ) 
    ); 

這種方法不需要聲明每個構造中的變量,但給了我2個新問題而不是:

  • 我現在已經寫了一個新的OR條件爲每種顏色
  • 各組條件增加了嵌套
額外水平

我的問題:是否有一種方法允許我使用簡寫語法來直接爲變量賦值?

如果沒有,我會有興趣瞭解爲什麼存在這個限制。

+0

我敢打賭你的同事愛你 – Steve 2014-09-26 14:54:46

+0

這是爲什麼?我只是想了解是否可以將我的switch語句翻譯成簡寫版本。實際上,我不會將我的同事暴露給多層嵌套內聯if語句。我的代碼在這個問題中的主題和內容只是一個例子。 – 2014-09-26 15:01:02

+0

這只是一個輕鬆的評論 - 我曾遇到類似野生代碼,這是一個令人沮喪的經歷! – Steve 2014-09-26 15:04:19

回答

4

工作太多。使用調度表。

$color_dispatch = Array(
    'red' => 'handlePrimaryColor', 
    'blue' => 'handlePrimaryColor', 
    ... 
); 

$color_type = null; 
if (array_key_exists($color_name, $color_dispatch)) 
{ 
    $color_type = $color_dispatch[$color_name]($in); 
} 
+0

好方法,但我認爲你想'isset($ color_dispatch [$ color_name])'或'array_key_exists'。檢查密鑰而不是值。 – AbraCadaver 2014-09-26 15:24:02

+0

@AbraCadaver:確實。固定。 – 2014-09-26 15:29:51

+0

我很抱歉,但我的問題的目的是要找出這種方法是否存在(如存在語句的速記)或瞭解爲什麼這樣的事情不能存在或不存在。我不在尋找替代品,但只是好奇。 – 2014-09-27 10:58:39