2010-08-30 12 views
11

Usando PHP, ¿hay una función/método/forma de verificar si una variable contiene algo que sería seguro poner en una construcción foreach? Algo así como¿Hay alguna manera de probar una variable para "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"); 
    } 
} 

Si su respuesta es "Configuración de un controlador para coger el error de PHP", se aprecian sus esfuerzos, pero estoy buscando otra cosa.

+1

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

Respuesta

15

Bueno, algo así. Que puede hacer:

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

Sin embargo, esto no garantiza el bucle foreach tendrá éxito. Puede arrojar una excepción o fallar silenciosamente. La razón es que algunos objetos iterables, en algún momento, pueden no tener información que ceder (por ejemplo, ya se han repetido y solo tiene sentido iterarlos una vez).

Ver Traversable. Las matrices no son objetos y, por lo tanto, no pueden implementar dicha interfaz (la preceden), pero pueden atravesarse en un bucle foreach.

+0

p. DOMNodeList es también un objeto con su propio método, pero extrañamente es compatible con foreach y es! Is_array (...). – thevikas

+0

tenga en cuenta que los objetos también se pueden alcanzar, por lo que es posible que desee agregar '|| is_object ($ var) 'al condicional. – jchook

-2

Comprobar usando is_array

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

puede foreach también los objetos – Galen

+0

El bucle 'foreach' admite mucho más que las matrices. – Artefacto

+0

Gracias por aclarar eso. Disculpas, mi mal. No uso PHP OOP mucho. – shamittomar

0

Dado que todos los objetos y las matrices son "foreachable" en PHP 5 + ...

function is_foreachable($var) { 
    return is_array($var) || is_object($var); 
} 
Cuestiones relacionadas