2014-07-17 10 views
16

Quindi ho quattro condizioni che ho bisogno di passare e ho pensato che sarebbe stato meglio usare l'istruzione switch in PHP. Tuttavia, ho bisogno di verificare se un intero è, diciamo, minore o uguale, o maggiore di e uguale.Utilizzo degli operatori di confronto nello switch PHP

switch ($count) { 
    case 20: 
     $priority = 'low'; 
     break; 

    case 40: 
     $priority = 'medium'; 
     break; 

    case 60: 
     $priority = 'high'; 
     break; 

    case 80: 
     $priority = 'severe'; 
     break; 
} 

Con una if() dichiarazione sarebbe simile al seguente:

if ($count <= 20) { 
    $priority = 'low'; 
} 

if ($count <= 40) { 
    $priority = 'medium'; 
} 

Che è possibile in switch-case?

+6

Bene potete 'cambiare (true)' e restituire true sui casi che soddisfano l'intervallo [Esempio] (http://stackoverflow.com/a/8876696/2344142). Se questo fosse su una scala più piccola, potresti semplicemente ripetere i numeri nell'intervallo e farli scorrere l'uno nell'altro [Esempio] (http://stackoverflow.com/a/4163212/2344142). Ma sì, per il tuo esempio, dovresti usare una dichiarazione if. –

+3

bastone con il tuo se –

+0

@DaveChen Questo è un bel trucco. – Havenard

risposta

57

Un caso più generale per risolvere questo problema è:

switch (true) { 
    case $count <= 20: 
     $priority = 'low'; 
     break; 

    case $count <= 40: 
     $priority = 'medium'; 
     break; 

    case $count <= 60: 
     $priority = 'high'; 
     break; 

    default: 
     $priority = 'severe'; 
     break; 
} 
2

n. switch() le istruzioni sono per eseguire test di uguaglianza multipli. Sono fondamentalmente solo una versione leggermente più facile da leggere (ma anche più pericolosa) di

if (x == 'a') { ... } 
else if (x == 'b') { ... } 
else if (x == 'c') { ... } 

codice. Non c'è modo di cambiare uno switch() da == a < o qualsiasi altro operatore di confronto. È rigorosamente per test di uguaglianza.

+0

cosa c'è di sbagliato nella soluzione @Konr Ness? –

1

interruttori non possono farlo, ma in questo caso particolare si può fare qualcosa di simile:

switch ((int)(($count - 1)/20)) { 
    case 0: 
     $priority = 'low'; 
     break; 
    case 1: 
     $priority = 'medium'; 
     break; 
    case 2: 
     $priority = 'high'; 
     break; 
    case 3: 
     $priority = 'severe'; 
     break; 
} 

Così in (int)(($count - 1)/20) tutti i valori da 0 a 20 saranno eval a 0, da 21 a 40 si eval per 1 e così via, che consente di utilizzare l'istruzione switch per questo scopo.

E dato che stiamo concatenato valori, possiamo anche semplificare ad un array:

$priorities = ['low', 'medium', 'high', 'severe']; 
$priority = $priorities[(int)(($count - 1)/20)]; 
1

C'è un modo che funziona in php 7 usando operatori di assegnazione ternaria. L'operatore è stato introdotto in precedenza su (5.4?), Ma non ho mai testato il codice su altre versioni. Ho scritto l'intero codice dell'interruttore there, tuttavia per brevità qui è solo la clausola specifica. Diciamo che vogliamo la condizione per abbinare per tutti i numeri maggiori o uguali a cinque:

switch($value){ 
case ($value >= 5?$value:!$value)://do something here 
break; 
}  

O ci permettono il valore $ per passare invariato o si nega il valore in base alla condizione. Un valore $ corrisponderà sempre a se stesso o fallirà il test contro la sua negazione.

+0

Posso confermare che questo approccio funziona su atleast php 5.5 –