2010-12-13 13 views
8

Devo controllare i big array per vedere se sono riempiti al 100% con valori numerici. L'unico modo che mi viene in mente è foreach e quindi is_numeric per ogni valore, ma è il modo più veloce?Qual è il modo più rapido per verificare se tutti i valori in una matrice sono numerici?

+2

* Qualsiasi * soluzione a questo problema si sovrapporrà ai valori dell'array. Se hai bisogno di farlo in codice o in una funzione, questo è per te un'altra domanda, ma in entrambi i casi c'è un ciclo. Quindi immagino che le prestazioni dovrebbero essere più o meno le stesse, indipendentemente da ciò che fai. – Joey

+1

E a proposito di convalidare i valori prima che entrino nell'array? –

+0

Non è così semplice perché i valori entrano e passano dall'array in modo casuale e alcuni di essi possono essere nulli o falsi o "", e quindi devo fare calcoli con essi, e il risultato di questi calcoli deve essere nullo se alcuni dati nell'array non sono numerici. – rsk82

risposta

12

supponendo che la matrice è unidimensionale e appena fatta di numeri interi:

return ctype_digit(implode('',$array)); 
+1

Dovuto annullare il mio voto, i valori 'false' e' NULL', che restituiscono false per 'is_numeric()' sono implosi come stringhe vuote qui, che sfuggono a 'ctype_digit()'. – BoltClock

+0

@BoltClock: OP assicura che l'array è "100% pieno di valori numerici" – stillstanding

+1

Penso che l'operazione implode sia piuttosto costosa nel tempo. – rsk82

-2

Il modo più veloce potrebbe essere quella di assumere solo sono tutti numeri e proseguire con l'operazione. Se la tua operazione fallisce in seguito, sai che qualcosa non è un numero. Ma se sono tutti numeri in realtà ... non puoi ottenere molto più veloce di O (0)!

+0

Ma alcuni valori non numerici scorreranno a causa di weaktyping/autocasting. L'ipotesi non è sicura. – Umbrella

+0

Perché è stato accettato come risposta? Non controlla nulla ... –

-1

Questa piccola funzione funziona bene per me

function IsNumericarr($arr){ 
    if(!is_array($arr)){ 
     return false; 
    } 
    else{ 
     foreach($arr as $ar){ 
      if(!is_numeric($ar)){ 
       return false; 
       exit; 
      } 
     } 
     return true; 
    } 
} 

loop è necessario

4
array_map("is_numeric", array(1,2,"3","hello")) 

Array ([0] => 1 [1] => 1 [2] => 1 [3] =>) 
0
if(array_reduce($array, function($c, $v){return $c & (int)is_numeric($v);}, 1)) 
+0

Questa risposta è stata contrassegnata automaticamente come di bassa qualità a causa della sua lunghezza e del suo contenuto. Una spiegazione potrebbe aiutare questa risposta a diventare più simile a una risposta di Overflow dello stack. – Popnoodles

2

Filtrare l'array usando is_numeric. Se la dimensione del risultato è la stessa dell'originale, tutti gli elementi sono numerici:

$array = array(1, '2', '45'); 
if (count($array) === count(array_filter($array, 'is_numeric'))) { 
    // all numeric 
} 
Problemi correlati