Hello All,
It seems to me that an instance of RecursiveIteratorIterator with ArrayObject
has no effect
when calling RecursiveArrayIterator::offsetUnset or
RecursiveArrayIterator::offsetSet methods.
But everything works fine when the iterator is created with a json_decoded -
json_encoded array.
I expect the same behavior of these two iterators, but maybe I am wrong.
Any guidance would be appreciated.
Test script:
----------------------------------
function example() {
$array = array (
'name' => 'text',
'items' => array (
'0' => array ( 'phrase' => 'text text', ),
'1' => array ( 'phrase' => 'text text text', ),
'ctrl' => array( '0' => '1', ),
),
);
$array_object = json_decode( json_encode( $array ));
$iterator = new RecursiveIteratorIterator( new
RecursiveArrayIterator( $array_object ),
RecursiveIteratorIterator::CHILD_FIRST );
// comment these two lines and see the nice execution
$array_object = new ArrayObject( $array, 0, "RecursiveArrayIterator" );
$iterator = new RecursiveIteratorIterator(
$array_object->getIterator(), RecursiveIteratorIterator::CHILD_FIRST );
foreach( $iterator as $key => $value ) {
$array_copy = $iterator->getInnerIterator()->getArrayCopy();
$keys = array_keys( $array_copy );
$numeric_keys = array_filter( $keys, 'is_numeric' );
if( count( $numeric_keys ) !== 0 && count( $keys ) == count(
$numeric_keys ) + 1 ) {
$ctrl = $array_copy['ctrl'];
$iterator->getInnerIterator()->offsetUnset( 'ctrl' );
foreach( $iterator->getInnerIterator() as $ctrl_value => $value ) {
if( in_array( $ctrl_value, $ctrl )) {
$iterator->getInnerIterator()->getChildren()->offsetSet(
'ctrl', $ctrl_value );
} else {
$iterator->getInnerIterator()->getChildren()->offsetSet(
'ctrl', '' );
}
}
// print_r( $iterator->getInnerIterator() );
}
}
print_r( object_to_array( $array_object ));
// print_r( iterator_to_array( $iterator ));
}
// helper method
function object_to_array( $object ) {
if( ! is_array( $object ) && ! is_object( $object )) {
return $object;
}
if( is_object( $object )) {
$object = get_object_vars( $object );
}
return array_map( __FUNCTION__, $object );
}
example();
Expected result:
--------------------------
[11-Mar-2013 18:24:48 UTC] Array
(
[name] => text
[items] => Array
(
[0] => Array
(
[phrase] => text text
[ctrl] =>
)
[1] => Array
(
[phrase] => text text text
[ctrl] => 1
)
)
)
--
PHP General Mailing List (http://www.php.net/)
To unsubscribe, visit: http://www.php.net/unsub.php