PHPでフラットな配列をツリー構造へ変換する
よくある、id, parent idが1レコードに入ったデータをツリー構造に変換するというお題っす。
PEARにPEAR :: 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のツリー構造が入ります。



