如何使用PHP从给定的数据库结构打印二进制树?

时间:2012-07-30 06:59:10

标签: php mysql database binary-tree

我有一个这种格式的MySQL数据库:

表名:btree_mst fields:id,parent_id,left_node_id,right_node_id,user_name

现在我要做的就是按照下面的无序列表格式打印

       
  • 根节点        
                  
    • 节点A.                 
                             
      • 节点A左
      •                      
      • 节点A右
      •                 
                  
    •             
    • 节点B.                 
                             
      • Node B Left
      •                      
      • Node B Right
      •                 
                  
    •        
       

我尝试为此制作一个递归函数,但没有按预期工作。 有什么建议吗?

以下是我制作的代码,http://pastebin.com/X15qAKaA 此代码中唯一的错误是,它每次都打印UL。它应该只在更改级别时打印。

提前致谢。

1 个答案:

答案 0 :(得分:1)

如果您的数据库中没有有序列表,则递归是合适的。

class A
{
    private $a = array(
        array(
            'id' => 1,
            'parent_id' => 0,
            'title' => 'ROOT'
        ),
        array(
            'id' => 2,
            'parent_id' => 1,
            'title' => 'A'
        ),
        array(
            'id' => 3,
            'parent_id' => 1,
            'title' => 'B'
        ),
        array(
            'id' => 4,
            'parent_id' => 2,
            'title' => 'A left'
        )
    );//your database values

    public function buildTree()
    {
        $aNodes = array();
        $iRootId = 1;//your root id
        foreach ($this->a AS $iK => $aV)
        {
            if($aV['id'] == $iRootId)
            {
                unset($this->a[$iK]);
                $aNodes[$aV['id']] = $aV;
                $aNodes[$aV['id']]['childs'] = $this->getChilds($aV['id']);
            }

        }

        print_r($aNodes);//print tree
    }

    private function getChilds($iParentId)
    {
        $aChilds = array();
        foreach ($this->a AS $iK => $aV)
        {
            if($aV['parent_id'] == $iParentId)
            {
                unset($this->a[$iK]);
                $aChilds[$aV['id']] = $aV;
                $aChilds[$aV['id']]['childs'] = $this->getChilds($aV['id']);
            }

        }

        return $aChilds;
    }

}

$o = new A();
$o->buildTree();