Heim  >  Artikel  >  Backend-Entwicklung  >  So erstellen Sie mit PHP ein unendliches Baummenü [allgemeiner Baumtyp]

So erstellen Sie mit PHP ein unendliches Baummenü [allgemeiner Baumtyp]

炎欲天舞
炎欲天舞Original
2017-08-20 09:03:071718Durchsuche

生成树型结构所需要的2维数组,var $arr = array()数组格式如下:

array(
          1 => array('id'=>'1','parentID'=>0,'name'=>'一级栏目一'),
          2 => array('id'=>'2','parentID'=>0,'name'=>'一级栏目二'),
          3 => array('id'=>'3','parentID'=>1,'name'=>'二级栏目一'),
          4 => array('id'=>'4','parentID'=>1,'name'=>'二级栏目二'),
          5 => array('id'=>'5','parentID'=>2,'name'=>'二级栏目三'),
          6 => array('id'=>'6','parentID'=>3,'name'=>'三级栏目一'),
          7 => array('id'=>'7','parentID'=>3,'name'=>'三级栏目二')
          )

生成树型结构所需修饰符号,可以换成图片:


var $icon = array('│','├','└');
var $ret = '';
var $html='';

构造函数,初始化类:


function tree($arr=array())
    {
       $this->arr = $arr;
       $this->ret = '';
       return is_array($arr);
    }

得到父级数组函数:


function get_parent($myid)
    {
        $newarr = array();
        if(!isset($this->arr[$myid])) return false;
        $pid = $this->arr[$myid]['parentID'];
        $pid = $this->arr[$pid]['parentID'];
        if(is_array($this->arr))
        {
            foreach($this->arr as $id => $a)
            {
                if($a['parentID'] == $pid) $newarr[$id] = $a;
            }
        }
        return $newarr;
    }

得到子级数组函数:


function get_child($myid)
    {
        $a = $newarr = array();
        if(is_array($this->arr))
        {
            foreach($this->arr as $id => $a)
            {
                if(@$a['parentID'] == $myid) {
                    $newarr[$id] = $a;
                }
            }
        }
        return $newarr ? $newarr : false;
    }

得到当前位置数组:


function get_pos($myid,&$newarr)
    {
        $a = array();
        if(!isset($this->arr[$myid])) return false;
        $newarr[] = $this->arr[$myid];
        $pid = $this->arr[$myid]['parentID'];
        if(isset($this->arr[$pid]))
        {
            $this->get_pos($pid,$newarr);
        }
        if(is_array($newarr))
        {
            krsort($newarr);
            foreach($newarr as $v)
            {
                $a[$v['id']] = $v;
            }
        }
        return $a;
    }

得到树型结构:

  $myid 表示获得这个ID下的所有子级;$str 生成树形结构基本代码, 例如: "64f2807516d7ae01055293cdcefd9e85\$spacer\$name4afa15d3069109ac30911f04c56f3338";$sid 被选中的ID, 比如在做树形下拉框的时候需要用到;函数如下:


function get_tree($myid, $str, $sid = 0, $adds = '', $str_group = '')
    {
        $number=1;
        $child = $this->get_child($myid);
        if(is_array($child)) {
            $total = count($child);
            foreach($child as $id=>$a) {
                $j=$k='';
                if($number==$total) {
                    $j .= $this->icon[2];
                } else {
                    $j .= $this->icon[1];
                    $k = $adds ? $this->icon[0] : '';
                }
                $spacer = $adds ? $adds.$j : '';
                $selected = $a["id"]==$sid ? 'selected' : '';
                @extract($a);
                @$parentID == 0 && $str_group ? eval("\$nstr = \"$str_group\";") : eval("\$nstr = \"$str\";");
                $this->ret .= $nstr;
                $this->get_tree($id, $str, $sid, $adds.$k.'  ',$str_group);
                $number++;
            }
        }
        return $this->ret;
    }

同上一方法类似,但允许多选:


function get_tree_multi($myid, $str, $sid = 0, $adds = '')
    {
        $number=1;
        $child = $this->get_child($myid);
        if(is_array($child))
        {
            $total = count($child);
            foreach($child as $id=>$a)
            {
                $j=$k='';
                if($number==$total)
                {
                    $j .= $this->icon[2];
                }
                else
                {
                    $j .= $this->icon[1];
                    $k = $adds ? $this->icon[0] : '';
                }
                $spacer = $adds ? $adds.$j : '';
                $selected = $this->have($sid,$id) ? 'selected' : '';
                @extract($a);
                eval("\$nstr = \"$str\";");
                $this->ret .= $nstr;
                $this->get_tree_multi($id, $str, $sid, $adds.$k.' ');
                $number++;
            }
        }
        return $this->ret;
    }
 
    function have($list,$item){
        return(strpos(',,'.$list.',',','.$item.','));
    }

格式化数组函数:


function getArray($myid=0, $sid=0, $adds='')
    {
        $number=1;
        $child = $this->get_child($myid);
        if(is_array($child)) {
            $total = count($child);
            foreach($child as $id=>$a) {
                $j=$k='';
                if($number==$total) {
                    $j .= $this->icon[2];
                } else {
                    $j .= $this->icon[1];
                    $k = $adds ? $this->icon[0] : '';
                }
                $spacer = $adds ? $adds.$j : '';
                @extract($a);
                $a['name'] = $spacer.' '.$a['name'];
                $this->ret[$a['id']] = $a;
                $fd = $adds.$k.' ';
                $this->getArray($id, $sid, $fd);
                $number++;
            }
        }
 
        return $this->ret;
    }

将数组转化为树形数组函数:


public function arrToTree($data,$pid){
        $tree = array();
        foreach($data as $k => $v){
            if($v['parentID'] == $pid){
                $v['parentID'] = $this->arrToTree($data,$v['id']);
                $tree[] = $v;
            }
        }   
        return $tree;
    }

左边菜单栏输出函数:


public function outToHtml($tree){
        $html = '';
        foreach($tree as $t){
            if(empty($t['parentID'])){
                $html .= "<li><a href=\"javascript:\" onclick=\"$.bringBack({id:&#39;$t[id]&#39;,name:&#39;$t[name]&#39;})\">$t[name]</a></li>";
            }else{
                $html .=&#39;<li><a href="javascript:">&#39;.$t[&#39;name&#39;].&#39;</a><ul>&#39;;
                $html .= $this->outToHtml($t[&#39;parentID&#39;]);
                $html  = $html.&#39;</ul></li>&#39;;
            }
        } 
        return $html;
    }

实例化调用tree类格式如下:


$tree = new tree;
 $tree->tree($categorys);
 echo "<select name=\"f_id\" >";
 echo "<option value=&#39;0&#39; >添加一级分类</option>";
 //get_tree(父ID,格式化字符窜,默认选中哪个分类,修饰前缀,父级分类样式) 前面两个必填,后面三个可选
 $data .= $tree->get_tree(0, "<option value=&#39;\$id&#39; \$selected>\$spacer\$name</option>\n", 0, &#39;&#39; , "<optgroup label=&#39;\$name&#39;></optgroup>");
 echo $data;
 echo "</select>";

 

Das obige ist der detaillierte Inhalt vonSo erstellen Sie mit PHP ein unendliches Baummenü [allgemeiner Baumtyp]. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn