2012-02-06 18 views

risposta

8

Vedere: Funzioni PHP e is_numeric().

In combinazione con array_filter, è possibile confrontare i due array per verificare se sono uguali.

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

Sarebbe bello se avesse bisogno di avere dati su ogni campo individualmente, ma piuttosto inefficiente quando hai solo bisogno di un valore per l'intero array, non è vero? – Vyktor

+0

Le mie scuse, ho letto la domanda sbagliata. L'ho aggiornato per usare array_filter, ma continuo a pensare che questa soluzione eseguirà due volte l'array attraverso l'array (ma credo sia inevitabile) –

+0

Capisco la logica della tua funzione, ma penso che molti programmatori abbiano dimenticato "vecchi modi" di pensare in modo procedurale e con approccio in sequenza alle cose. Dai un'occhiata alla mia risposta, sinceramente dimmi cosa non ti piace. – Vyktor

3

Se stai cercando di fare un unico passaggio attraverso l'array, si potrebbe scrivere la propria funzione per controllare ciascuno dei valori rispetto ai criteri specifici. Qualcosa di simile:

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

Quindi è possibile filtrare la matrice come:

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

Beh, in realtà dipende da cosa si intende per "o stringa o numerica" ​​(questo potrebbe significare is_numeric(X), o is_int(X) || is_string(X), o un numero qualsiasi di altre cose). Probabilmente il modo più efficiente (anche se è più prolisso) è questo:

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

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

    return $valid; 
} 
7

più efficace sarebbe questo:

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

Questo metodo:

  • non creerà nuovo array
  • si interromperà dopo il primo valore non valido
0

Un sacco di risposte per questo. Se vuoi usare il metodo che hai usato, vorresti scrivere la tua funzione per questo.

così per ogni elemento della matrice che si sta per verificare se è un numero:

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

e quindi chiamare quella funzione di prova utilizzando array_filter

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

Hai scritto una funzione ' is_string() '? Altrimenti, array_filter($arr, 'is_string') potrebbe non funzionare come pensi.).

+1

Non avresti la stessa cosa con meno codice se avessi appena eseguito if (array_filter ($ arr, 'is_numeric') invece di creare una nuova funzione. –

+0

Sembra fuori tema per me –

0

due fatti:

  • foreach è più veloce di array_map(), perché si pretende molto chiamare una funzione su ogni iterazione
  • utilizzando l'operatore === è più veloce di is_int/is_string, in questo modo:

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

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

Problemi correlati