广告: http://hi.baidu.com/zjstandup/blog/item/040d2b468ec18c0c6a63e5ce.html

解决方案 »

  1.   

    <?php
    class Array2Tree
    {
    private $_arr;

    private $_tree;

    public function __construct($arr) {
    $this->_arr = $arr;
    }

    private function _getdata($id) {
    $data = array();
    foreach ($this->_arr as $key => $row) {
    if ($row["bid"] == $id)
    $data[] = $row;
    }
    return $data;
    }

    private function _load($id) {
    $set = $this->_getdata($id);
    if (0 == count($set)) {
    return $set;
    } else {
    foreach ($set as $row) {
    $sub = array($row["name"]);
    $sub['sub'] = $this->_load($row["id"]);
    $tree[] = $sub;
    }
    }
    return $tree;
    }

    public function load($id = 0) {
    $this->_tree = $this->_load($id);
    return $this;
    }

    public function gettree() {
    return $this->_tree;
    }
    }
    $arr = array(
    array("id"=>1, "bid"=>0, "name"=>"足球"),
    array("id"=>2, "bid"=>0, "name"=>"篮球"),
    array("id"=>3, "bid"=>1, "name"=>"巴西"),
    array("id"=>4, "bid"=>1, "name"=>"中国"),
    array("id"=>5, "bid"=>3, "name"=>"罗纳尔多"),
    array("id"=>6, "bid"=>4, "name"=>"米卢"),
    );
    ?>
    简单写了一个,效率稍微有点问题,可以修改一下递归部分,把搜寻父节点的任务在递归中完成,那就不需要用_getdata函数遍历整个数组了
    下面是输出结果:$a2t = new Array2Tree($arr);
    $zero = $a2t->load()->gettree(); //默认输出整颗树
    print_r($zero);
    结果:
    Array
    (
        [0] => Array
            (
                [0] => 足球
                [sub] => Array
                    (
                        [0] => Array
                            (
                                [0] => 巴西
                                [sub] => Array
                                    (
                                        [0] => Array
                                            (
                                                [0] => 罗纳尔多
                                                [sub] => Array
                                                    (
                                                    )                                        )                                )                        )                    [1] => Array
                            (
                                [0] => 中国
                                [sub] => Array
                                    (
                                        [0] => Array
                                            (
                                                [0] => 米卢
                                                [sub] => Array
                                                    (
                                                    )                                        )                                )                        )                )        )    [1] => Array
            (
                [0] => 篮球
                [sub] => Array
                    (
                    )        ))$one = $a2t->load(1)->gettree(); //load()方法接受树的节点号,输出该节点下的所有子节点
    print_r($one);
    结果:
    Array
    (
        [0] => Array
            (
                [0] => 巴西
                [sub] => Array
                    (
                        [0] => Array
                            (
                                [0] => 罗纳尔多
                                [sub] => Array
                                    (
                                    )                        )                )        )    [1] => Array
            (
                [0] => 中国
                [sub] => Array
                    (
                        [0] => Array
                            (
                                [0] => 米卢
                                [sub] => Array
                                    (
                                    )                        )                )        ))
      

  2.   

    joomla里面有串好代码,很简单很强大./*
    id     bid    name
    1      0      足球 
    2      0      篮球 
    3      1      巴西 
    4      1      中国 
    5      3      罗纳尔多 
    6      4      米卢 
    */   
    $array[0] = array("id"=>1,"bid"=>0,"name"=>"足球");
    $array[1] = array("id"=>2,"bid"=>0,"name"=>"篮球");
    $array[2] = array("id"=>3,"bid"=>1,"name"=>"巴西");
    $array[3] = array("id"=>4,"bid"=>1,"name"=>"中国");
    $array[4] = array("id"=>5,"bid"=>3,"name"=>"罗纳尔多");
    $array[5] = array("id"=>6,"bid"=>4,"name"=>"米卢");//tree array -- copy some codes from joomla
    $tree = array();
    if( $array ){
    foreach ( $array as $v ){
    $pt  = $v['bid'];
    $list = @$tree[$pt] ? $tree[$pt] : array();
    array_push( $list, $v );
    $tree[$pt] = $list;
    }
    }//foreach root node
    foreach($tree[0] as $k=>$v)
    {
    echo $v['name']."<br/>";
    if($tree[$v['id']]) drawTree($tree[$v['id']],$tree,0);

    }
    //foreach child node
    function drawTree($arr,$tree,$level)
    {
    $level++;
    $prefix = str_pad("|",$level+1,'-',STR_PAD_RIGHT);
    foreach($arr as $k2=>$v2)
    {
    echo $prefix.$v2['name']."<br/>";
      if($tree[$v2['id']]) drawTree($tree[$v2['id']],$tree,$level);

    }
    }
    exit;