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

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

炎欲天舞
Freigeben: 2023-03-15 12:24:01
Original
1841 Leute haben es durchsucht

生成树型结构所需要的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'=>'三级栏目二')
          )
Nach dem Login kopieren

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


var $icon = array('│','├','└');
var $ret = '';
var $html='';
Nach dem Login kopieren

构造函数,初始化类:


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

得到父级数组函数:


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;
    }
Nach dem Login kopieren

得到子级数组函数:


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;
    }
Nach dem Login kopieren

得到当前位置数组:


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;
    }
Nach dem Login kopieren

得到树型结构:

  $myid 表示获得这个ID下的所有子级;$str 生成树形结构基本代码, 例如: "";$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;
    }
Nach dem Login kopieren

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


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.','));
    }
Nach dem Login kopieren

格式化数组函数:


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;
    }
Nach dem Login kopieren

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


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;
    }
Nach dem Login kopieren

左边菜单栏输出函数:


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;
    }
Nach dem Login kopieren

实例化调用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>";
Nach dem Login kopieren

 

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!

Verwandte Etiketten:
Quelle:php.cn
Erklärung dieser Website
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
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage