<?php

$root = new ArrayObject(array(
    'nodes'=>new ArrayObject(array(
        '1'=>new ArrayObject(array(
            'id'=>'1',
            'nodes'=>new ArrayObject(array(
                '4'=>new ArrayObject(array(
                    'id'=>'4',
                    'nodes'=>new ArrayObject(array(
                        '5'=>new ArrayObject(array(
                            'id'=>'5',
                            'nodes'=>new ArrayObject(array())
                        ))
                    ))
                ))
            ))
        )),
        '2'=>array(
            'id'=>'2',
            'nodes'=>new ArrayObject(array())
        ),
        '3'=>new ArrayObject(array(
            'id'=>'3',
            'nodes'=>new ArrayObject(array())
        ))
    ))
));

foreach ($root['nodes'] as $_node_id => $_root_node) {
    $_put_parent = function ($_node) use (&$_put_parent) {
        foreach ($_node['nodes'] as $_sub_node_id => $_sub_node) {
            $_put_parent($_sub_node);
            $_sub_node['parent'] = $_node;
        }
    };

    $_root_node['parent'] = null;
    $_put_parent($_root_node);
}

echo '<pre>';
var_dump($root['nodes']['1']['nodes']['4']);
var_dump($root['nodes']['1']['nodes']['4']['nodes']['5']['parent']);
echo '</pre>';

?>