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を作るシンタックスシュガー入れてほしい。