Quiero usar un foreach
bucle con una variable, pero esta variable puede ser de muchos tipos diferentes, NULL
por ejemplo.
Entonces, antes de foreach
probarlo:
if(is_array($var)){
foreach($var as ...
Pero me di cuenta de que también puede ser una clase que implemente Iterator
interfaz. Tal vez soy ciego, pero ¿cómo verificar si la clase implementa la interfaz? ¿Existe algo como is_a
función u inherits
operador? 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_array
o "implementa la Iterator
interfaz" o debería probar algo más?
Respuestas:
Si está utilizando
foreach
dentro 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
foreach
dentro de una función o está esperando ambas , simplemente puede usar esta construcción para verificar si puede iterar sobre la variable:fuente
is_array
caro. 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 Traversable
Funcionará con matrices? No tuve la oportunidad de probar su rendimiento.Traversable
entonces sí.$var = array(1,2,3);
los resultados son:is_array($var) = true
y$var instanceof Traversable = false
.Iterator
y, por lo tanto, no funcionan conTraversable
.foreach
puede manejar matrices y objetos. Puedes comprobar esto con:No necesita verificar específicamente,
Traversable
ya 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
Traversable
con una función simple. Esto funcionaría para todo estoIterator
porqueIterator extends Traversable
fuente
devuelve
bool(false)
obool(true)
fuente
Funciones
Ejemplo
fuente
Desde PHP 7.1 existe un pseudo-tipo
iterable
exactamente para este propósito. La sugerencia de tipoiterable
acepta cualquier matriz, así como cualquier implementación de laTraversable
interfaz. 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