#はじめに
データベースなどに保存されているレコードからツリー構造を作成する必要があったため作成。
これで作ったデータはechoなどで書き出すとツリー構造になって出力される。
jsonで出力して、jsTreeに渡すと手軽にjavascriptでツリーが作れる。
#データについて
元となるデータの構造はあまり関係ないので、ノードごとに自身のIDと親のIDを保持していれば構築できる。
サンプルデータ
$data = array(
'a' => array(
'parent' => 'b',
'data' => ノードのデータ
),
'b' => array(
'parent' => '',
'data' => ノードのデータ
)
)
#サンプルコード
tree.php
public static function tree($data)
{
$tree = array();
$index = array();
// 単純な2次元配列をツリー形式に変換
foreach($data as $id => $value){
$index[$id] = array(
// 自身のユニークなID
'id' => $id,
// 親のノードID
'parent' => $value['parent'],
// 子ノードを保持するための配列
'children' => array(),
// 元々のデータを持たせるなど以降は適当
'data' => $value
);
}
// 親子関係を割り当て
foreach($index as $key => $value){
// 他のノードの子ノードになっている場合
// ついでに循環参照になっていないかも確認
if(array_key_exists($value['parent'], $index) && $value['parent'] != $value['id'])
{
// リファレンス渡し
$index[$value['parent']]['children'][] = & $index[$key];
}
// ルートノードの場合
else
{
$tree[] = & $index[$key];
}
}
return $tree;
}