PHPでフラットな配列をツリー構造へ変換する

よくある、id, parent idが1レコードに入ったデータをツリー構造に変換するというお題っす。

PEARPEAR :: Package :: Treeというパッケージがあり、これを使おうかなと思ったんだけど、DBのサポートとかXMLのサポートとかいらんし、エンドユーザー向けのドキュメントないし、どうせソース読むならPerlで使っていたアレを移植しよう。

というわけで、Sort::Treeのlist_to_treeだけ移植。

このくらいのシンプルさがちょうど良いのです。

< ?php

class Tree
{
  public static function list_to_tree(
    $list = array(),
    $idField = 'id',
    $parentField = 'parent_id'
  ){
    if (! is_array($list)){
      return false;
    }
    $tree = array();
    $index = array();

    foreach($list as $value){
      $id = $value[$idField];
      $pid = $value[$parentField];

      if (isset($index[$id])){
        $value["kids"] = $index[$id]["kids"];
        $index[$id] = $value;
      } else {
        $index[$id] = $value;
      }

      if ($pid == 0){
        $tree[] = & $index[$id];
      } else {
        $index[$pid]["kids"][] = & $index[$id];
      }
    }
    return $tree;
  }
}

?>

使い方も、

require_once("Tree.class.php");
$result_tree = Tree::list_to_tree($list);

これで、$result_treeには$listのツリー構造が入ります。

ダウンロード用(treeclassphp.gz)

pagetop