2012-04-13 1 views
1

Есть ли способ сделать общую обработку, а затем конкретную без с помощью другого корпуса переключателя?PHP - Switch, case и «go on» - множественный выбор generic then specific

switch ($var) { 
    case 'A' : 
    /* SPECIFIC TREATMENT 1 */ 
    break; 
    case 'B' : 
    /* SPECIFIC TREATMENT 2 */ 
    break; 
    case 'C' : 
    case 'D' : 
    case 'E' : 
    /* GENERIC, COMMON TREATMENT */ 
    // go on, check again $var ! :(
    case 'C' : 
    /* SPECIFIC TREATMENT 3 */ 
    break; 
    case 'D' : 
    /* SPECIFIC TREATMENT 4 */ 
    break; 
    case 'E' : 
    /* SPECIFIC TREATMENT 5 */ 
    break; 
    case 'F' : 
    /* SPECIFIC TREATMENT 6 */ 
    break; 
    default : 
    /* DEFAULT TREATMENT */ 
    break; 
} 

Для того, чтобы избежать дублирования кода, то это будет действительно эффективным ... С помощью другого коммутатора() в первой является то, что я хотел бы избежать. Благодаря !

ответ

2
$cases = array('A','B','C','D'); 
if (in_array($var, $cases)) { 
    /* GENERIC, COMMON TREATMENT */ 

    switch ($var) { 
     case 'A' : 
      /* SPECIFIC TREATMENT 1 */ 
     break; 
     case 'B' : 
      /* SPECIFIC TREATMENT 2 */ 
     break; 
     case 'C' : 
      /* SPECIFIC TREATMENT 3 */ 
     break; 
     case 'D' : 
      /* SPECIFIC TREATMENT 4 */ 
     break; 

    } 
} else { 
    /* DEFAULT TREATMENT */ 

} 

На основе вашего последующего редактирования, я бы сохранить тот же подход

$cases = array('A','B','C','D','E','F','G'); 
if (in_array($var, $cases)) { 
    $common = array('C','D','E'); 
    if (in_array($var, $common)) { 
     /* GENERIC, COMMON TREATMENT */ 
    } 
    switch ($var) { 
     case 'A' : 
      /* SPECIFIC TREATMENT 1 */ 
     break; 
     case 'B' : 
      /* SPECIFIC TREATMENT 2 */ 
     break; 
     case 'C' : 
      /* SPECIFIC TREATMENT 3 */ 
     break; 
     case 'D' : 
      /* SPECIFIC TREATMENT 4 */ 
     break; 
     case 'E' : 
      /* SPECIFIC TREATMENT 2 */ 
     break; 
     case 'F' : 
      /* SPECIFIC TREATMENT 3 */ 
     break; 
     case 'G' : 
      /* SPECIFIC TREATMENT 4 */ 
     break; 

    } 
} else { 
    /* DEFAULT TREATMENT */ 

} 
+0

Не так уж и плохо! Но я выберу @kolink ответ, потому что в моем случае некоторые из случаев не имеют никакого общего лечения. Я редактирую еще раз. ;) –

+0

@Ash_ Я добавил редактирование, которое решает ваш модифицированный случай – Crisp

+0

Awesome! Большое спасибо парню! –

4

Эмм ...

$txt = "You pick the letter ".$var; 

Авось?

+0

Nononono это был всего лишь пример, я не могу этого сделать ^^ –

+0

@Ash_: Что значит «не может этого сделать»? –

+0

Несомненно, если вы можете сравнить его для целей 'switch', вы можете это сделать? Если вы не хотите отображать что-то другое, кроме операнда сравнения? – BenM

3
$txt = "you picked the letter "; 
    $var = 'C'; 
    switch ($var) { 
     case 'A' : 
     $txt .= "A"; 
     break; 
     case 'B' : 
     $txt .= "B"; 
     break; 
     case 'C' : 
     $txt .= "C"; 
     break; 
     case 'D' : 
     $txt .= "D"; 
     break; 
     default : 
     $txt = 'you didnt pick A or B or C or D'; 
     break; 
    } 
    echo $txt; 
0
$var='c'; 
$arr=array('A'=>'xxx',B=>'xxxxxx'.......); 
echo 'some you want '.$arr($var); 
2
$common = function() use (&$var) { 
    // do stuff that is common to several cases 
}; 
switch($var) { 
    case 'A': 
     $common(); 
     // now specific stuff 
     break; 
    case 'B': 
     $common(); 
     // specific 
     break; 
} 

и так далее. Вы по-прежнему получаете повторение $common(), но, по крайней мере, это меньше, чем вы, вероятно, захотите сделать.

+0

Симпатичные. Я думаю, что это в основном то, что я хочу. (редактирование моего сообщения снова) –