2010-12-13 18 views
8

Debo comprobar las matrices grandes para ver si están 100% llenas de valores numéricos. La única forma en que me viene a la mente es foreach y luego is_numeric para cada valor, pero ¿es esa la manera más rápida?¿Cuál es la forma más rápida de verificar si todos los valores en una matriz son numéricos?

+2

* Cualquier * solución a este problema pasará por los valores de la matriz. Si necesita hacerlo en código o una función lo hace para usted es otra pregunta, pero en ambos casos hay un bucle. Así que supongo que el rendimiento debería ser prácticamente el mismo, independientemente de lo que hagas. – Joey

+1

¿Qué hay de validar los valores antes de que entren en la matriz? –

+0

No es tan simple porque los valores entran y salen de la matriz de forma aleatoria y algunos de ellos pueden ser nulos o falsos o "", y luego debo hacer cálculos con ellos, y el resultado de estos cálculos debe ser nulo si algunos de los datos en la matriz no son numéricos. – rsk82

Respuesta

12

asumiendo que su matriz es unidimensional y simplemente compuesta de números enteros:

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

Tuve que deshacer mi voto, los valores 'false' y' NULL', que devuelven false para 'is_numeric()' se implosionan como cadenas vacías aquí, escapando 'ctype_digit()'. – BoltClock

+0

@BoltClock: OP asegura que la matriz está "100% llena con valores numéricos" – stillstanding

+1

Creo que la operación de implosión es bastante costosa en el tiempo. – rsk82

-2

La forma más rápida podría ser simplemente asumir que todos son números y continuar con su operación. Si su operación falla más tarde, entonces sabrá que algo no es un número. Pero si todos son números ... ¡no se puede obtener mucho más rápido que O (0)!

+0

Pero algunos valores no numéricos se saldrán debido a la debilidad/autocasting. La suposición no es segura. – Umbrella

+0

¿Por qué esto fue aceptado como la respuesta? No comprueba nada ... –

-1

Esta pequeña función funciona bien para mí

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

Loop se necesita

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

Esta respuesta se marcó automáticamente como de baja calidad debido a su longitud y contenido. Una explicación ayudaría a que esta respuesta se parezca más a una respuesta de desbordamiento de pila. – Popnoodles

2

filtro de la matriz mediante is_numeric. Si el tamaño del resultado es el mismo que el original, todos los elementos son numéricos:

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