PHP
備忘録
ツリー構造

PHPでツリー構造のデータを構築する

はじめに

データベースなどに保存されているレコードからツリー構造を作成する必要があったため作成。
これで作ったデータは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){
    $parent = ;
    $id = $value['id'];
    // 他のノードの子ノードになっている場合
    // ついでに循環参照になっていないかも確認
    if(array_key_exists($value['parent'], $index) && $value['parent'] != $value['id'])
    {
      // リファレンス渡し
      $index[$value['parent']]['children'][] = & $index[$key];
    }
    // 根ノードの場合
    else
    {
      $tree[] = & $index[$key];
    }
  }

  return $tree;
}