You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

154 lines
4.4 KiB

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

<?php
namespace tp5auth\library;
/**
* 通用的树型类,可以生成任何树型结构
*/
class Tree
{
public $text,$html;
/**
* 生成树型结构所需要的2维数组
* @var array
*/
public $arr = array();
/**
* 生成树型结构所需修饰符号,可以换成图片
* @var array
*/
public $icon = array('│', '├', '└');
public $nbsp = "&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 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 = '') {
$parent_id = '';
$nstr = '';
$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);
$parent_id == 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_authTree($myid){
$id = '';
$nstr = '';
$child = $this->get_child($myid);
if (is_array($child)) {
$level = current($child);
$text = isset($this->text[$level['level']]) ? $this->text[$level['level']] : end($this->text);
foreach($child as $k=>$v){
@extract($v);
if($this->get_child($id)){
eval("\$nstr = \"$text[0]\";");
$this->html .= $nstr;
self::get_authTree($id);
eval("\$nstr = \"$text[1]\";");
$this->html .= $nstr;
}else{
$a = $this->text['other'];
eval("\$nstr = \"$a\";");
$this->html .= $nstr;
}
}
}
return $this->html;
}
/**
* 得到子级数组
* @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['parent_id'] == $myid)
$newarr[$id] = $a;
}
}
return $newarr ? $newarr : false;
}
/**
* 递归获取级别
* @param int $id ID
* @param array $array 所有菜单
* @param int $i 所在级别
* @return array
*/
public function get_level($id, $array = array(), $i = 0) {
if ($array[$id]['parent_id']==0 || empty($array[$array[$id]['parent_id']]) || $array[$id]['parent_id']==$id){
return $i;
}else{
$i++;
return self::get_level($array[$id]['parent_id'],$array,$i);
}
}
}