2010-08-30 11 views
11

Utilizzo di PHP, esiste una funzione/metodo/modo per verificare se una variabile contiene qualcosa che sarebbe sicuro inserire in un costrutto foreach? Qualcosa di simileEsiste un modo per testare una variabile per "isForEachable"

//the simple case, would probably never use it this bluntly 
function foo($things) 
{ 
    if(isForEachable($things)) 
    { 
     foreach($things as $thing) 
     { 
      $thing->doSomething(); 
     } 
    } 
    else 
    { 
     throw new Exception("Can't foreach over variable"); 
    } 
} 

Se la vostra risposta è "l'installazione di un gestore per rilevare l'errore di PHP", i vostri sforzi sono apprezzati, ma sto cercando qualcosa di diverso.

+1

correlati: http://stackoverflow.com/questions/3584700/iterable-objects-and-array-type- suggerimento/ – quantumSoup

risposta

15

Beh, più o meno. Si può fare:

if (is_array($var) || ($var instanceof Traversable)) { 
    //... 
} 

Tuttavia, questo non garantisce il ciclo foreach avrà successo. Può generare un'eccezione o fallire silenziosamente. Il motivo è che alcuni oggetti iterabili, a un certo punto, potrebbero non avere alcuna informazione da fornire (ad esempio, erano già stati ripetuti e ha senso solo iterarli una volta).

Vedere Traversable. Le matrici non sono oggetti e quindi non possono implementare tale interfaccia (la precedono), ma possono essere attraversate in un ciclo foreach.

+0

ad es. DOMNodeList è anche un oggetto con un proprio metodo, ma stranamente è foreach compatibile e il suo! Is_array (...). – thevikas

+0

nota che anche gli oggetti sono raggiungibili, quindi potresti voler aggiungere '|| is_object ($ var) 'al condizionale. – jchook

-2

controllare usando is_array

if(is_array($things)) 
     echo "it is foreachable"; 
else 
     echo "Not it's not foreachable."; 
+0

è possibile foreach anche gli oggetti – Galen

+0

Il ciclo 'foreach' supporta molto più degli array. – Artefacto

+0

Grazie per averlo chiarito. Mi scuso, mio ​​cattivo. Non uso molto PHP OOP. – shamittomar

0

Poiché tutti gli oggetti e gli array sono "foreachable" in PHP 5 + ...

function is_foreachable($var) { 
    return is_array($var) || is_object($var); 
} 
Problemi correlati