Percorrendo matrizes com SPL e RecursiveArrayIterator
Neste artigo, iremos estudar como percorrer matrizes de forma recursiva utilizando a biblioteca SPL e as classes RecursiveArrayIterator e RecursiveIteratorIterator.
A Biblioteca SPL (Standard PHP Library) é um conjunto de classes e interfaces em PHP que implementam algumas formas comuns de acessos à dados. São projetadas para manipular estruturas complexas como arrays, xml, diretórios, consultas ao banco de dados, dentre outros.
Dentro da biblioteca SPL, a classe ArrayObject permite manipular vetores e a classe ArrayIterator permite percorrer vetores por meio de uma interface totalmente orientada a objetos. Os últimos artigos que escrevemos foram para demonstrar justamente estas características. Neste exemplo, vamos mostrar duas formas de percorrer uma matriz.
A classe ArrayIterator pode ser suficiente para percorrer vetores simples, de uma dimensão. Entretanto para percorrer vetores com várias dimensões (matrizes), que no modo tradicional podemos utilizar um foreach() dentro de outro foreach(), na biblioteca SPL podemos percorrer por meio da classe RecursiveArrayIterator(). Entretanto ao executar o código a seguir, o que vemos são arrays, que deveriam ser novamente percorridos para ter seu resultado exibido na tela. O que pode estar errado então?
<?php
$carros = array(
array('nome'=>'palio', 'marca'=>'fiat', 'tipo'=>'hatch'),
array('nome'=>'siena', 'marca'=>'fiat', 'tipo'=>'sedan'),
array('nome'=>'ka', 'marca'=>'ford', 'tipo'=>'hatch'),
array('nome'=>'fiesta','marca'=>'ford', 'tipo'=>'sedan'),
array('nome'=>'gol', 'marca'=>'vw', 'tipo'=>'hatch'),
array('nome'=>'voyage','marca'=>'vw', 'tipo'=>'sedan'),
array('nome'=>'corsa', 'marca'=>'gm', 'tipo'=>'hatch'),
array('nome'=>'prisma','marca'=>'gm', 'tipo'=>'sedan')
);
// cria um iterator recursivo
$iterator = new RecursiveArrayIterator(new ArrayObject($carros));
foreach ($iterator as $it)
{
var_dump($it);
}
?>array(3) {
["nome"]=>
string(5) "palio"
["marca"]=>
string(4) "fiat"
["tipo"]=>
string(5) "hatch"
}
Para exibir matrizes, é necessário percorrer recursivamente também o objeto RecursiveArrayIterator. Fazemos isto utilizando a classe RecursiveIteratorIterator, que recebe um iterator como parâmetro e percorre-o recursivamente. Veja no exemplo a seguir.
<?php
$carros = array(
array('nome'=>'palio', 'marca'=>'fiat', 'tipo'=>'hatch'),
array('nome'=>'siena', 'marca'=>'fiat', 'tipo'=>'sedan'),
array('nome'=>'ka', 'marca'=>'ford', 'tipo'=>'hatch'),
array('nome'=>'fiesta','marca'=>'ford', 'tipo'=>'sedan'),
array('nome'=>'gol', 'marca'=>'vw', 'tipo'=>'hatch'),
array('nome'=>'voyage','marca'=>'vw', 'tipo'=>'sedan'),
array('nome'=>'corsa', 'marca'=>'gm', 'tipo'=>'hatch'),
array('nome'=>'prisma','marca'=>'gm', 'tipo'=>'sedan')
);
// cria um iterator recursivo
$iterator = new RecursiveIteratorIterator(new RecursiveArrayIterator(new ArrayObject($carros)));
foreach ($iterator as $it)
{
var_dump($it);
}
?>string(5) "palio"
string(4) "fiat"
string(5) "hatch"
string(5) "siena"
string(4) "fiat"
string(5) "sedan"









