The root node is not there because you are not using the RecursiveArrayIterator correctly.
It's intended use is to have an array with multiple sub-arrays in any level and structure, and give this array into ONE instance of the RecursiveArrayIterator, and to iterate over everything, put this into a RecursiveIteratorIterator.
That way, the entire array, including it's top level, will be iterated.
Because you abused the RecursiveArrayIterator to be the carrier of information, the top level object is not iterated.
Suggested easy example that has some nastyness, but demonstrates the principle:
$root = array( 'root_level' );
$block = array( 'first_level' );
$child = array( 'second_level' );
$child_of_child_a = array( 'third_level_a' );
$child_of_child_b = array( 'third_level_b' );
$child[] = $child_of_child_a;
$child[] = $child_of_child_b ;
$child_of_child_a[] = array('');
$child_of_child_a[] = array('');
$block[] = $child;
$root[] = $block ;
$storage = new \RecursiveIteratorIterator( new \RecursiveArrayIterator($root), RecursiveIteratorIterator::SELF_FIRST );
var_dump($root);
foreach ($storage as $key=>$value) {
echo $key.": ".$value."\n";
}
Result output:
array(2) {
[0] =>
string(10) "root_level"
[1] =>
array(2) {
[0] =>
string(11) "first_level"
[1] =>
array(3) {
[0] =>
string(12) "second_level"
[1] =>
array(1) {
...
}
[2] =>
array(1) {
...
}
}
}
}
0: root_level
1: Array
0: first_level
1: Array
0: second_level
1: Array
0: third_level_a
2: Array
0: third_level_b
It's output is not quite the same, but my point is that you can iterate over the structure without having every single node to be an instance of the RecursiveArrayIterator. You can add anything that is either an array, or an object acting as an array, or an object that can usefully be iterated.