<?php// 树组的顺序即是分类的顺序,因此前当分类的下级子类一定要紧随其后$tree= array(1 => array('id'=>1, 'cname'=>'一级分类', 'pid'=>0),2 => array('id'=>2, 'cname'=>'二级分类', 'pid'=>1),3 => array('id'=>3, 'cname'=>'三级分类', 'pid'=>2),4 => array('id'=>4, 'cname'=>'四级分类', 'pid'=>3),5 => array('id'=>5, 'cname'=>'四级分类2', 'pid'=>3),6 => array('id'=>6, 'cname'=>'一级分类2', 'pid'=>0),);// 指定分类ID,返回子类量(不进行深度递归)function getChildTotal($id){global $tree; //静态变量$total = 0;foreach($tree as $value){if ($id == $value['pid']){$total++; }}return $total;}// 指定分类ID,并返回数组(不进行深度递归)function getChildArray($id){global $tree;$array = array();foreach($tree as $key=>$value){if ($id == $value['pid']){$array[$key] = $value;}}return $array;}// 递归查询方式将树数组转换成HTML嵌套树function getTreeHTML($tree){static $item = array();if ($tree){foreach($tree as $id => $node){if (!in_array($id, $item)){$item[] = $id;$html .= "<dl>";$html .= '<dt classify="'.$node['id'].'">'.$node['cname']."</dt>";if (getChildTotal($node['id'])){$tree_last = getChildArray($node['id']);foreach($tree_last as $v){$html .= '<dd>';$html .= getTreeHTML($tree_last);$html .= '</dd>';}}else{$html .= '';}$html .= '</dl>';}}}return $html;}$html = getTreeHTML($tree);echo $html;$html = getTreeHTML($tree);echo $html;?>
我需要通过递归来产生嵌套的HTML结构,这个似乎有点蛋疼,但之所以这样是确保HTMl嵌套就成为一棵树因为静态变量会冲突,所以不希望使用!!!!!!!!

解决方案 »

  1.   


    <?php
    $tree = array(
    1 => array('id' => 1, 'cname' => '一级分类', 'pid' => 0),
    2 => array('id' => 2, 'cname' => '二级分类', 'pid' => 1),
    3 => array('id' => 3, 'cname' => '三级分类', 'pid' => 2),
    4 => array('id' => 4, 'cname' => '四级分类', 'pid' => 3),
    5 => array('id' => 5, 'cname' => '四级分类2', 'pid' => 3),
    6 => array('id' => 6, 'cname' => '一级分类2', 'pid' => 0),
    );

    function getChildArray($pid,$tree){
    $arr=array();
    if(count($tree)>0){
    foreach($tree as $node){
    if($node['pid'] == $pid){
    $arr[] = $node;
    }
    }
    }
    return $arr;
    }

    function getHtml($tree,$pid=0){
    $list =getChildArray($pid,$tree);
    $html ='';
    if(count($list)>0){
    $html ="<dl>\n";
    foreach($list as $item){
    $html.='<dt>id:'.$item['id'].'Name:'.$item['cname'].'PID:'.$item['pid']."</dt>\n";
    }
    $html.=getHtml($tree,++$pid);
    $html.="</dl>\n";
    }
    return $html;
    }echo getHtml($tree);
    ?>希望对你有帮助
      

  2.   

    参考http://blog.csdn.net/ihefe/archive/2010/12/14/6075541.aspx
      

  3.   


    <?php
    $tree = array(
    1 => array('id' => 1, 'cname' => '一级分类', 'pid' => 0),
    2 => array('id' => 2, 'cname' => '二级分类', 'pid' => 1),
    3 => array('id' => 3, 'cname' => '三级分类', 'pid' => 2),
    4 => array('id' => 4, 'cname' => '四级分类', 'pid' => 3),
    5 => array('id' => 5, 'cname' => '四级分类2', 'pid' => 3),
    6 => array('id' => 6, 'cname' => '一级分类2', 'pid' => 0),
    );

    function getChildArray($pid,$tree){
    $arr=array();
    if(count($tree)>0){
    foreach($tree as $node){
    if($node['pid'] == $pid){
    $arr[] = $node;
    }
    }
    }
    return $arr;
    }

    function getHtml($tree,$pid=0){
    $list =getChildArray($pid,$tree);
    $html ='';
    if(count($list)>0){
    $html ="<dl>\n";
    foreach($list as $item){
    $html.='<dt>id:'.$item['id'].'Name:'.$item['cname'].'PID:'.$item['pid']."</dt>\n";
    $html.=getHtml($tree,$item['id']);
    }
    $html.="</dl>\n";
    }
    return $html;
    }echo getHtml($tree);
    ?>
    刚才有段代码写错了...
      

  4.   

    这个不是静态变量,是全局变量,可以考虑变通一下,不要使用global
      

  5.   

    递归的话就可以把当前节点的level传给子节点。