Dezembro 5th 2007 01:42 pm
array X ArrayIterator == cópia X referência
A questão é a seguinte, imagine que você precise imprimmir todos os elementos de um array, qual a solução para isso? use um foreach, óbvio.
Agora vamo imaginar que dentro deste foreach onde você esta imprimindo os elementos de seu array, tenha alguma lógica que pode adicionar ou não mais elementos ao array que você esta iterando no momento. Ex.:
-
$a = array('PHP', 'Java', 'Ruby');
-
-
foreach ($a as $value) {
-
if ($value == 'PHP') {
-
$a[] = 'PHP-GTK';
-
}
-
-
echo $value . "\r\n";
-
}
Reparem que no exemplo acima a saida final seria:
PHP
Java
Ruby
E o PHP-GTK por que não imprimiu?
Isto acontece porque o PHP faz com que o foreach trabalhe com um 'cópia' do array que você passou como parametro assim quando você adiciona um elemento para o seus array, não irá influenciar na cópia que esta sendo usada pelo foreach.
Esta situação é facilmente resolvida se você utilizar um objeto que implemente a interface Iterator, como o ArrayIterator por exemplo.
Se você passar um objeto do tipo Iterator como parametro para o comando foreach ele não irá criar uma cópia de seu objeto, irá utilizar a referência. Desta maneira é possível garantir que todos os elementos de seu array serão iterados. Ex.:
-
$a = array('PHP', 'Java', 'Ruby');
-
$a = new ArrayIterator($a);
-
-
foreach ($a as $value) {
-
if ($value == 'PHP') {
-
$a[] = 'PHP-GTK';
-
}
-
-
echo $value . "\r\n";
-
}
Espero que a informação tenha sido util, infelizmente na documentação do
PHP este tipo de situação não esta "bem documentada".
Abraço a todos.
2 Comments »














Fill on 12 Dez 2007 at 11:11 #
Putz… eu nem sabia disso, gostei do artigo, não sei quando vou usar este método mas quando precisar ja sei o que fazer =) Abraço
bigodines on 14 Dez 2007 at 11:03 #
Bom blog. parabéns.