PHP StdClass実習

data = [
    {from:1, to:2},
    {from:1, to:4},
    {from:2, to:5},
    {from:2, to:6},
];

こういうデータを

{
    root:{
       id:1, children:[
            {
                id:2, children:[
                   {id:5, children:[]},
                   {id:6, children:[]}
                ]
            },
            {id:4, children:[]}
        ]
    }
}

こういうデータ構造に変換したい。
jsの場合。

data = [
    {from:1, to:2},
    {from:1, to:4},
    {from:2, to:5},
    {from:2, to:6},
];

var dummy = {id:1, children:[]};
var hash = {1: dummy};

var tree = { "root": dummy};

for ( var i in data ) {
    var d = data[i];
    var node = hash[ d.from ];

    var newOne ={
id: d.to,
    children: []
    };
    hash[ d.to ] = newOne;
    console.log(node)
        node.children.push(newOne);

}
uneval(tree)

PHPの場合。

<?php
function i($from, $to) {
    $i = new StdClass();
    $i->from = $from;
    $i->to = $to;
    return $i;
}
function cell($id) {
    $i = new StdClass();
    $i->id = $id;
    $i->children = array();
    return $i;
}

$data = array(
    i(1, 2),
    i(1, 4),
    i(2, 5),
    i(2, 6),
);

$dummy = cell(1);
$hash = array(1 => &$dummy);

$tree = array("root" => $dummy);

foreach ($data as $k => $d) {
    $node = $hash[$d->from];

    $newOne = cell($d->to);
    $hash[ $d->to ] = $newOne;
    $node->children[] = $newOne;
}

print_r($tree);
?>

arrayを使うと言語仕様にはまるけどStdClassを使えばいける。
またひとつPHPでなんとかする方法を覚えた...

ネームスペースなんか今のままで困ってないからarrayとStdClassを作るシンタックスシュガー入れてほしい。