A very useful use case for RecusiveIteratorIterator in combination with RecursiveArrayIterator is to replace array values on a multidimensional array at any level deep.



Usually, array_walk_recursive would be used to replace values deep within arrays, but unfortunately this only works when there is a standard key value pair - in other words, array_walk_recursive ONLY VISITS LEAF NODES, NOT arrays.



So to get around this, the iterators can be used in this way:



<?php

$array = [

'test' => 'value' ,

'level_one' => [

'level_two' => [

'level_three' => [

'replace_this_array' => [

'special_key' => 'replacement_value' ,

'key_one' => 'testing' ,

'key_two' => 'value' ,

'four' => 'another value'

]

],

'ordinary_key' => 'value'

]

]

];



$arrayIterator = new \ RecursiveArrayIterator ( $array );

$recursiveIterator = new \ RecursiveIteratorIterator ( $arrayIterator , \ RecursiveIteratorIterator :: SELF_FIRST );



foreach ( $recursiveIterator as $key => $value ) {

if ( is_array ( $value ) && array_key_exists ( 'special_key' , $value )) {

$replaced = array_fill ( 0 , count ( $value ), $value [ 'special_key' ]);

$value = array_combine ( array_keys ( $value ), $replaced );

$value [ 'new_key' ] = 'new value' ;



$currentDepth = $recursiveIterator -> getDepth ();

for ( $subDepth = $currentDepth ; $subDepth >= 0 ; $subDepth --) {

$subIterator = $recursiveIterator -> getSubIterator ( $subDepth );

$subIterator -> offsetSet ( $subIterator -> key (), ( $subDepth === $currentDepth ? $value : $recursiveIterator -> getSubIterator (( $subDepth + 1 ))-> getArrayCopy ()));

}

}

}

return $recursiveIterator -> getArrayCopy ();

$array = [

'test' => 'value' ,

'level_one' => [

'level_two' => [

'level_three' => [

'replace_this_array' => [

'special_key' => 'replacement_value' ,

'key_one' => 'replacement_value' ,

'key_two' => 'replacement_value' ,

'four' => 'replacement_value' ,

'new_key' => 'new value'

]

],

'ordinary_key' => 'value'

]

]

];

?>



The key is in traversing back up the tree to save the changes at that level - simply calling $recursiveIterator->offsetSet(); will only set a key on the root array.