2010-11-05 14 views
10

Mi piacerebbe andare da questo:confrontare i valori multipli in PHP

if($var == 3 || $var == 4 || $var == 5 || $var =='string' || $var == '2010-05-16') { execute code here }

a questo:

if($var == (3, 4, 5, 'string', '2010-05-16')) {execute code here }

sembra molto ridondante per continuare a digitare $ var, e trovo che lo rende un po 'ingombrante da leggere. C'è un modo in PHP per semplificarlo in questo modo? Ho letto su un post qui che quando si utilizza XQuery è possibile utilizzare l'operatore = come in $ var = (1,2,3,4,5), ecc

Grazie, John

risposta

26

Inserire i valori in una matrice, quindi utilizzare la funzione in_array() per verificare se esistono.

$checkVars = array(3, 4, 5, "string", "2010-05-16"); 
if(in_array($var, $checkVars)){ 
    // Value is found. 
} 

+0

Una delle prime risposte, bella soluzione e include un collegamento al manuale. Grazie! – John

+2

[A partire da PHP 5.4 è anche possibile utilizzare la sintassi dell'array breve, che sostituisce array() con \ [\]] (http://www.php.net/manual/en/language.types.array.php), quindi solo 'if (in_array ($ var, [3,4,5," stringa "," 2010-05-16 "])) {...}' è sufficiente. –

+0

PHP 5.4 non _replace_ 'array()' con '[]' – Greg

2

Oppure si può usare in_array()

if(in_array($var,array(4,5,'string','2010-05-16',true)) { 

} 
4

È possibile utilizzare in_array().

if (in_array($var, array(3,4,5,"string","2010-05-16"))) { .... } 
0
$vals = array (3, 4, 5, 'string', '2010-05-16'); 
if(in_array($var, $vals)) { 
    //execute code here 
} 
5
if (in_array($var, array(3, 4, 5, 'string', '2010-05-16'))) {execute code here } 

O, in alternativa, un blocco switch:

switch ($var) { 
    case 3: 
    case 4: 
    case 5: 
    case 'string': 
    case '2010-05-16': 
     execute code here; 
     break; 
} 
+0

La prima soluzione è eccellente.La seconda opzione qui funziona, proprio come la dichiarazione if che ho proposto funziona, ma credo che sia altrettanto ingombrante. Invece di digitare $ var molte volte, è necessario digitare case più volte. Grazie per la risposta! – John

7

Se è necessario eseguire questo controllo molto spesso ed hai bisogno di buone prestazioni, don' t utilizzare una ricerca con array lento ma utilizzare una ricerca rapida con hash table:

$vals = array(
    1 => 1, 
    2 => 1, 
    'Hi' => 1, 
); 

if (isset($vals[$val])) { 
    // go! 
} 
+1

Questa è una soluzione molto interessante. Dovrò eseguire uno script o due per vedere come si confronta la velocità, dato che sono piuttosto curioso ora. – John

+2

Hmmmm ... oltre 6 anni dopo e nessuna conclusione? Si comincia a sospettare che il codice debba essere piuttosto lento. :-) –

0

Ho avuto questo problema e risolto, rendendo questa funzione:

function orEquals(){ 
    $args = func_get_args(); 

    foreach($args as $arg){ 
     if ($arg != $args[0]){ 
      if($arg == $args[0]){ 
       return true; 
       break; 
      } 
     } 
    } 
    unset($args); 
} 

allora si può solo chiamare la funzione in questo modo:

if(orEquals($var, 3, 4, 5, 'string', '2010-05-16')){ 
//your code here 
} 
1

Giusto per dare una soluzione alternativa all'uso di in_array:

In alcuni casi potrebbe essere più veloce impostare un array in cui i valori sono chiavi e quindi verificare con isset()

Esempio:

$checkVars= [3 => true, 
      4 => true, 
      5 => true, 
      "string" => true, 
      "2010-05-16" => true]; 

if(isset($checkVars[$var]) 
{ 
    // code here 
} 

EDIT: Ho fatto alcuni test e sembra che questo metodo è più veloce nella maggior parte dei casi.

Problemi correlati