Re: RecursiveArrayIterator

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



there is no base case in the printArrayKeysRecursively method;
therefore it is not handling recursion; its just using the
RecursiveArrayItereators public methods.  i think that is totally appropriate.
but i believe i understand what youre getting at; namely the
RecursiveArrayIterator implments Iterator, sooo, we should be able
to use the foreach construct in our client code to cleanly iterate over the
object.  here is a new revision, which you may like more
than the first one:

<?php
$array = array(
array('name'=>'butch', 'sex'=>'m', 'breed'=>'boxer'),
array('name'=>'fido', 'sex'=>'m', 'breed'=>'doberman'),
array('name'=>'girly','sex'=>'f', 'breed'=>'poodle')
);

$iterator = new RecursiveArrayIterator($array);

foreach($iterator as $outerValue) {
foreach($outerValue as $innerKey => $innerValue) {
echo $innerKey . ' => ' . $innerValue . PHP_EOL;
}
}
?>

notice that there are 2 foreach invocations; those correspond directly to
the levels of nesting in $array.  so if you had another level of
nesting in $array, there would have to be another level of nesting in the
foreach invocations (if you want to do something w/ those values).  that
brings us to RecursiveIteratorIterator
which quoting Harry Fuecks in his article on
SPL<http://www.sitepoint.com/article/php5-standard-library>
*RecursiveIteratorIterator: this helps you do cool stuff like "flatten" a
hierarchical data structure so that you can loop through it with a single
foreach statement, while still preserving knowledge of the hierarchy. This
class could be very useful for rendering tree menus, for example.

*as i understand it RecursiveIteratorIterator essentially allows you to
define a particular action depending on which level of children is currently
being operated on.  so i think the decision to use that over
RecursiveArrayIterator comes down to the number of levels of nesting that
will be in your data structure.  if it will always be 2 levels (or a static
number of levels that is relatively small), stick w/ RecursiveArrayIterator,
otherwise if the number of nested levels is going to vary (or be more than a
few), i think, thats when you need to consider RecursiveIteratorIterator.

-nathan

note: im still a newb on spl myself :)

On 7/22/07, Kevin Waterson <kevin@xxxxxxxxxxx> wrote:

This one time, at band camp, "Nathan Nobbe" <quickshiftin@xxxxxxxxx>
wrote:

Thanks for the response.
I was hoping to avoid this sort of recursion within userspace and keep
it at a lower level. Should not the recursive iterator recurse so we
dont need to be using user defined functions?

> printArrayKeysRecursively($innerRecursiveArrayIterator); // handle
printing

Kind regards
Kevin

--
"Democracy is two wolves and a lamb voting on what to have for lunch.
Liberty is a well-armed lamb contesting the vote."

--
PHP General Mailing List (http://www.php.net/)
To unsubscribe, visit: http://www.php.net/unsub.php



[Index of Archives]     [PHP Home]     [Apache Users]     [PHP on Windows]     [Kernel Newbies]     [PHP Install]     [PHP Classes]     [Pear]     [Postgresql]     [Postgresql PHP]     [PHP on Windows]     [PHP Database Programming]     [PHP SOAP]

  Powered by Linux