php通用的树型类创建无限级树型菜单
生成樹型結構所需要的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 生成樹形結構基本代碼, 例如: "<option value=\$id \$select>\$spacer\$name</option>";$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:\" οnclick=\"$.bringBack({id:'$t[id]',name:'$t[name]'})\">$t[name]</a></li>";}else{$html .='<li><a href="javascript:">'.$t['name'].'</a><ul>';$html .= $this->outToHtml($t['parentID']);$html = $html.'</ul></li>';}} return $html;}實例化調用tree類格式如下:
$tree = new tree;$tree->tree($categorys);echo "<select name=\"f_id\" >";echo "<option value='0' >添加一級分類</option>";//get_tree(父ID,格式化字符竄,默認選中哪個分類,修飾前綴,父級分類樣式) 前面兩個必填,后面三個可選$data .= $tree->get_tree(0, "<option value='\$id' \$selected>\$spacer\$name</option>\n", 0, '' , "<optgroup label='\$name'></optgroup>");echo $data;echo "</select>";tree完整類下載地址:http://pan.baidu.com/s/1gfai1qj
密碼:sah8
?
轉載于:https://www.cnblogs.com/sztx/p/9499761.html
超強干貨來襲 云風專訪:近40年碼齡,通宵達旦的技術人生總結
以上是生活随笔為你收集整理的php通用的树型类创建无限级树型菜单的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Windows Embedded从入门到
- 下一篇: PHP代码审计笔记--变量覆盖漏洞