Quiero usar un foreachbucle con una variable, pero esta variable puede ser de muchos tipos diferentes, NULLpor ejemplo.
Entonces, antes de foreachprobarlo:
if(is_array($var)){
foreach($var as ...
Pero me di cuenta de que también puede ser una clase que implemente Iteratorinterfaz. Tal vez soy ciego, pero ¿cómo verificar si la clase implementa la interfaz? ¿Existe algo como is_afunción u inheritsoperador? Lo encontré class_implements, puedo usarlo, pero ¿tal vez hay algo más simple?
Y segundo, más importante, supongo que existe esta función, ¿sería suficiente para comprobar si la variable is_arrayo "implementa la Iteratorinterfaz" o debería probar algo más?

Respuestas:
Si está utilizando
foreachdentro de una función y espera una matriz o un objeto Traversable , puede escribir una pista de esa función con:Si no está usando
foreachdentro de una función o está esperando ambas , simplemente puede usar esta construcción para verificar si puede iterar sobre la variable:fuente
is_arraycaro. El costo computacional pareció aumentar con el tamaño de la matriz (lo cual no tiene sentido ya que solo se trata de verificar si es una matriz). Pero me pasó espantosamente en una biblioteca. Vea mi comentario en la pregunta vinculada. ¿instanceof TraversableFuncionará con matrices? No tuve la oportunidad de probar su rendimiento.Traversableentonces sí.$var = array(1,2,3);los resultados son:is_array($var) = truey$var instanceof Traversable = false.Iteratory, por lo tanto, no funcionan conTraversable.foreachpuede manejar matrices y objetos. Puedes comprobar esto con:No necesita verificar específicamente,
Traversableya que otros lo han insinuado en sus respuestas, porque todos los objetos, como todas las matrices, se pueden atravesar en PHP.Más técnicamente:
( fuente )
Dicho simplemente en la programación PHP común, siempre que una variable es
y no es
puedes usarlo
foreach.fuente
Puede verificar la instancia de
Traversablecon una función simple. Esto funcionaría para todo estoIteratorporqueIterator extends Traversablefuente
devuelve
bool(false)obool(true)fuente
Funciones
Ejemplo
fuente
Desde PHP 7.1 existe un pseudo-tipo
iterableexactamente para este propósito. La sugerencia de tipoiterableacepta cualquier matriz, así como cualquier implementación de laTraversableinterfaz. PHP 7.1 también introdujo la funciónis_iterable(). Para versiones anteriores, consulte otras respuestas aquí para lograr la aplicación de tipo equivalente sin las funciones integradas más nuevas.Juego limpio: como señaló BlackHole, esta pregunta parece ser un duplicado de objetos Iterables y sugerencias de tipo de matriz. y su respuesta es más detallada que la mía.
fuente