2012-02-06 9 views

Respuesta

8

Ver: PHP is_string() y is_numeric() funciones.

Combinado con array_filter, puede comparar las dos matrices para ver si son iguales.

function isStringOrNumeric($in) { 
// Return true if $in is either a string or numeric 
    return is_string($in) || is_numeric($in); 
} 

class Test{} 

$a = array('one', 2, 'three', new Test()); 
$b = array_filter($a, 'isStringOrNumeric'); 

if($b === $a) 
    echo('Success!'); 
else 
    echo('Fail!'); 
+0

Sería genial si necesitara tener datos en cada campo individualmente, pero es bastante ineficiente cuando solo necesita un valor para toda la matriz, ¿no es así? – Vyktor

+0

Mis disculpas, lea la pregunta equivocada. Lo he actualizado para usar el array_filter, pero sigo pensando que esta solución se repetirá dos veces (pero creo que es inevitable) –

+0

Entiendo la lógica de su función, pero creo que muchos programadores olvidaron las "viejas maneras" de pensar de forma procedimental y con un enfoque secuencial de las cosas. Echa un vistazo a mi respuesta, honestamente dime qué te gusta de ella. – Vyktor

3

Si usted está buscando para hacer una sola pasada a través de la matriz, podría escribir su propia función para verificar cada uno de los valores con sus criterios específicos. Algo así como:

function is_string_or_numeric($var) 
{ 
    return is_string($var) || is_numeric($var); 
} 

podrá filtrar la matriz como:

if (array_filter($arr, 'is_string_or_numeric') === $arr) 
0

Bueno, realmente depende de lo que entendemos por "ya sea de cadena o numérica" ​​(esto podría significar is_numeric(X) o is_int(X) || is_string(X), o cualquier cantidad de otras cosas). Probablemente la forma más eficiente (aunque es más detallado) es la siguiente:

public function isValid(array $array) { 
    $valid = TRUE; 

    foreach ($arr as $value) { 
     if (!is_int($value) && !is_string($value)) { 
      $valid = FALSE; 
      break; 
     } 
    } 

    return $valid; 
} 
7

más eficaz sería la siguiente:

function isStringNumberArray($array){ 
    foreach($array as $val){ 
    if(!is_string($val) && !is_numeric($val)){ 
     return false; 
    } 
    } 
    return true; 
} 

Este método:

  • no creará nueva matriz
  • se detendrá después del primer valor no válido
0

Muchas respuestas para esta. Si desea utilizar el método que ha estado utilizando, querrá escribir su propia función para esto.

por lo que para cada elemento de la matriz que se va a comprobar si es un número:

function isNumber($array_element) { 
    return is_numeric($array_element); 
} 

y luego llamar a esa función de prueba utilizando array_filter

if (array_filter($arr, 'is_number') { 
    // is a number code here. 
} 

¿Ha escrito una función ' is_string() '? De lo contrario, array_filter($arr, 'is_string') puede no estar funcionando de la manera que usted cree que es).

+1

¿No obtendrías lo mismo con menos código si acabaras de ejecutar if (array_filter ($ arr, 'is_numeric') en lugar de crear una nueva función. –

+0

Parece fuera de tema para mí –

0

dos hechos:

  • foreach es más rápido que array_map(), ya que es imposible llamar a una función en cada iteración
  • usando el operador === es más rápido que is_int/is_string, así:

    if ((int)$value === $value) echo "its an int";

    if ((string)$value === $value) echo "its a string";

Cuestiones relacionadas