php中tree類的使用方法

來源:互聯網
上載者:User
本文主要和大家分享php中tree類的使用方法,希望能協助到大家。

<?phpinclude 'tree.class.php';//類比資料庫$data=array(    array('id'=>1,'pid'=>0,'name'=>'一級欄目一'),    array('id'=>2,'pid'=>0,'name'=>'一級欄目二'),    array('id'=>3,'pid'=>1,'name'=>'二級欄目一'),    array('id'=>4,'pid'=>3,'name'=>'三級欄目一'),    array('id'=>5,'pid'=>4,'name'=>'四級欄目一'),);//轉換資料$tree_data=array();foreach ($data as $key=>$value){    $tree_data[$value['id']]=array(        'id'=>$value['id'],        'parentid'=>$value['pid'],        'name'=>$value['name']    );}/** * 輸出樹形結構 */$str="<tr>    <td><input type='checkbox' name='list[\$id]' value='\$id'></td>    <td>\$id</td>    <td>\$spacer\$name</td>    <td><a href='add.php?id=\$id'>添加</a></td>    <td><a href='del.php?id=\$id'>刪除</a></td>    <td><a href='update.php?id='\$id'>修改</a></td>    </tr>";$tree=new Tree();$tree->init($tree_data);echo "<table>";echo $tree->get_tree(0, $str);echo "</table>";echo "<br/>";echo "<br/>";echo "<br/>";echo "<br/>";/** * 輸出下拉式清單 */$str="<option value=\$id \$selected>\$spacer\$name</option>";$tree=new Tree();$tree->init($tree_data);echo "<select>";echo $tree->get_tree(0, $str,2);echo "</select>";

tree.class.php

<?php/*** 通用的樹型類,可以產生任何樹型結構*/class tree {/*** 產生樹型結構所需要的2維數組* @var array*/public $arr = array();/*** 產生樹型結構所需修飾符號,可以換成圖片* @var array*/public $icon = array('│','├','└');public $nbsp = " ";/*** @access private*/public $ret = '';/*** 建構函式,初始化類* @param array 2維數組,例如:* 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'=>'三級欄目二')*      )*/public function init($arr=array()){       $this->arr = $arr;   $this->ret = '';   return is_array($arr);}    /*** 得到父級數組* @param int* @return array*/public 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;}    /*** 得到子級數組* @param int* @return array*/public 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;}    /*** 得到當前位置數組* @param int* @return array*/public 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;}    /*** 得到樹型結構* @param int ID,表示獲得這個ID下的所有子級* @param string 產生樹型結構的基本代碼,例如:"<option value=\$id \$selected>\$spacer\$name</option>"* @param int 被選中的ID,比如在做樹型下拉框的時候需要用到* @return string*/public 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=>$value){$j=$k='';if($number==$total){$j .= $this->icon[2];}else{$j .= $this->icon[1];$k = $adds ? $this->icon[0] : '';}$spacer = $adds ? $adds.$j : '';$selected = $id==$sid ? 'selected' : '';@extract($value);$parentid == 0 && $str_group ? eval("\$nstr = \"$str_group\";") : eval("\$nstr = \"$str\";");$this->ret .= $nstr;$nbsp = $this->nbsp;$this->get_tree($id, $str, $sid, $adds.$k.$nbsp,$str_group);$number++;}}return $this->ret;}    /*** 同上一方法類似,但允許多選*/public 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;} /*** @param integer $myid 要查詢的ID* @param string $str   第一種HTML代碼方式* @param string $str2  第二種HTML代碼方式* @param integer $sid  預設選中* @param integer $adds 首碼*/public function get_tree_category($myid, $str, $str2, $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);if (empty($html_disabled)) {eval("\$nstr = \"$str\";");} else {eval("\$nstr = \"$str2\";");}$this->ret .= $nstr;$this->get_tree_category($id, $str, $str2, $sid, $adds.$k.' ');$number++;}}return $this->ret;}/** * 同上一類方法,jquery treeview 風格,可伸縮樣式(需要treeview外掛程式支援) * @param $myid 表示獲得這個ID下的所有子級 * @param $effected_id 需要產生treeview目錄數的id * @param $str 末級樣式 * @param $str2 目錄層級樣式 * @param $showlevel 直接顯示層級數,其餘為非同步顯示,0為全部限制 * @param $style 目錄樣式 預設 filetree 可增加其他樣式如'filetree treeview-famfamfam' * @param $currentlevel 計算當前層級,遞迴使用 適用改函數時不需要用該參數 * @param $recursion 遞迴使用 外部調用時為FALSE */    function get_treeview($myid,$effected_id='example',$str="<span class='file'>\$name</span>", $str2="<span class='folder'>\$name</span>" ,$showlevel = 0 ,$style='filetree ' , $currentlevel = 1,$recursion=FALSE) {        $child = $this->get_child($myid);        if(!defined('EFFECTED_INIT')){           $effected = ' id="'.$effected_id.'"';           define('EFFECTED_INIT', 1);        } else {           $effected = '';        }$placeholder = '<ul><li><span class="placeholder"></span></li></ul>';        if(!$recursion) $this->str .='<ul'.$effected.'  class="'.$style.'">';        foreach($child as $id=>$a) {        @extract($a);if($showlevel > 0 && $showlevel == $currentlevel && $this->get_child($id)) $folder = 'hasChildren'; //如設定顯示層級模式@2011.07.01        $floder_status = isset($folder) ? ' class="'.$folder.'"' : '';            $this->str .= $recursion ? '<ul><li'.$floder_status.' id=\''.$id.'\'>' : '<li'.$floder_status.' id=\''.$id.'\'>';            $recursion = FALSE;            if($this->get_child($id)){            eval("\$nstr = \"$str2\";");            $this->str .= $nstr;                if($showlevel == 0 || ($showlevel > 0 && $showlevel > $currentlevel)) {$this->get_treeview($id, $effected_id, $str, $str2, $showlevel, $style, $currentlevel+1, TRUE);} elseif($showlevel > 0 && $showlevel == $currentlevel) {$this->str .= $placeholder;}            } else {                eval("\$nstr = \"$str\";");                $this->str .= $nstr;            }            $this->str .=$recursion ? '</li></ul>': '</li>';        }        if(!$recursion)  $this->str .='</ul>';        return $this->str;    }/** * 擷取子欄目json * Enter description here ... * @param unknown_type $myid */public function creat_sub_json($myid, $str='') {$sub_cats = $this->get_child($myid);$n = 0;if(is_array($sub_cats)) foreach($sub_cats as $c) {$data[$n]['id'] = iconv(CHARSET,'utf-8',$c['catid']);if($this->get_child($c['catid'])) {$data[$n]['liclass'] = 'hasChildren';$data[$n]['children'] = array(array('text'=>' ','classes'=>'placeholder'));$data[$n]['classes'] = 'folder';$data[$n]['text'] = iconv(CHARSET,'utf-8',$c['catname']);} else {if($str) {@extract(array_iconv($c,CHARSET,'utf-8'));eval("\$data[$n]['text'] = \"$str\";");} else {$data[$n]['text'] = iconv(CHARSET,'utf-8',$c['catname']);}}$n++;}return json_encode($data);}private function have($list,$item){return(strpos(',,'.$list.',',','.$item.','));}}?>

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.