8
6

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

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

Last updated at Posted at 2018-01-28

#はじめに
データベースなどに保存されているレコードからツリー構造を作成する必要があったため作成。
これで作ったデータは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;
}
8
6
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
8
6

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?