Quero usar um foreach
loop com uma variável, mas essa variável pode ser de muitos tipos diferentes, NULL
por exemplo.
Portanto, antes de foreach
testá-lo:
if(is_array($var)){
foreach($var as ...
Mas percebi que também pode ser uma classe que implementa Iterator
interface. Talvez eu seja cego, mas como verificar se a classe implementa interface? Existe algo como is_a
função ou inherits
operador? Eu descobri class_implements
, posso usar, mas talvez haja algo mais simples?
E segundo, mais importante, suponho que essa função exista, seria o suficiente para verificar se a variável is_array
ou "implementa Iterator
interface" ou devo testar algo mais?
Respostas:
Se você estiver usando
foreach
dentro de uma função e estiver esperando uma matriz ou um objeto Traversable, você pode digitar hint essa função com:Se você não estiver usando
foreach
dentro de uma função ou se espera as duas, você pode simplesmente usar esta construção para verificar se você pode iterar na variável:fonte
is_array
que era caro. O custo computacional pareceu aumentar com o tamanho do array (o que não faz sentido, pois é apenas verificar se é um array). Mas isso aconteceu comigo de forma chocante em uma biblioteca. Veja meu comentário na pergunta vinculada. Funcionaráinstanceof Traversable
com matrizes? Não tive a chance de testar seu desempenho.Traversable
então sim.$var = array(1,2,3);
os resultados são:is_array($var) = true
e$var instanceof Traversable = false
.Iterator
e, portanto, não funcionam comTraversable
.foreach
pode lidar com matrizes e objetos. Você pode verificar isso com:Você não precisa verificar especificamente,
Traversable
pois outros sugeriram em suas respostas, porque todos os objetos - como todos os arrays - podem ser percorridos em PHP.Mais tecnicamente:
( fonte )
Simplesmente dito na programação PHP comum, sempre que uma variável é
e não é
você pode usar
foreach
nele.fonte
Você pode verificar a instância de
Traversable
com uma função simples. Isso funcionaria para tudo issoIterator
porqueIterator extends Traversable
fonte
retorna
bool(false)
oubool(true)
fonte
Funções
Exemplo
fonte
Desde o PHP 7.1 existe um pseudo-tipo
iterable
exatamente para este propósito. A sugestão de tipoiterable
aceita qualquer array, bem como qualquer implementação daTraversable
interface. PHP 7.1 também introduziu a funçãois_iterable()
. Para versões mais antigas, veja outras respostas aqui para realizar a aplicação de tipo equivalente sem os recursos integrados mais recentes.Fair play: como BlackHole apontou, esta questão parece ser uma duplicata de objetos Iteráveis e dicas de tipo de array? e sua resposta vai em mais detalhes do que a minha.
fonte