114 lines
3.0 KiB
PHP
114 lines
3.0 KiB
PHP
![]() |
<?php
|
|||
|
/**
|
|||
|
* 前台tree相关
|
|||
|
* @author yupoxiong<i@yufuping.com>
|
|||
|
*/
|
|||
|
namespace generate\traits;
|
|||
|
|
|||
|
trait Tree
|
|||
|
{
|
|||
|
public $text, $html;
|
|||
|
/**
|
|||
|
* 生成树型结构所需要的2维数组
|
|||
|
* @var array
|
|||
|
*/
|
|||
|
public $array;
|
|||
|
|
|||
|
/**
|
|||
|
* 生成树型结构所需修饰符号,可以换成图片
|
|||
|
* @var array
|
|||
|
*/
|
|||
|
public $icon = array('│', '├', '└');
|
|||
|
public $space = ' ';
|
|||
|
/**
|
|||
|
* @access private
|
|||
|
*/
|
|||
|
public $ret = '';
|
|||
|
|
|||
|
|
|||
|
/**
|
|||
|
* 构造函数,初始化类
|
|||
|
* @param array $arr
|
|||
|
* @return bool
|
|||
|
*/
|
|||
|
public function initTree($arr=[])
|
|||
|
{
|
|||
|
$this->array = $arr;
|
|||
|
$this->ret = '';
|
|||
|
$this->html = '';
|
|||
|
return is_array($arr);
|
|||
|
}
|
|||
|
|
|||
|
/**
|
|||
|
* 得到树型结构
|
|||
|
* @param int $my_id ,表示获得这个ID下的所有子级
|
|||
|
* @param string $str 生成树型结构的基本代码,例如:"<option value=\$id \$selected>\$spacer\$name</option>"
|
|||
|
* @param int $sid 被选中的ID,比如在做树型下拉框的时候需要用到
|
|||
|
* @param string $adds
|
|||
|
* @param string $str_group
|
|||
|
* @return string
|
|||
|
*/
|
|||
|
public function getTree($my_id, $str, $sid = 0, $adds = '', $str_group = '')
|
|||
|
{
|
|||
|
$parent_id = '';
|
|||
|
$n_str = '';
|
|||
|
$number = 1;
|
|||
|
$child = $this->getChild($my_id);
|
|||
|
|
|||
|
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);
|
|||
|
0 == $parent_id && $str_group ? eval("\$n_str = \"$str_group\";") : eval("\$n_str = \"$str\";");
|
|||
|
$this->ret .= $n_str;
|
|||
|
$space = $this->space;
|
|||
|
$this->getTree($id, $str, $sid, $adds . $k . $space, $str_group);
|
|||
|
$number++;
|
|||
|
}
|
|||
|
}
|
|||
|
return $this->ret;
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
/**
|
|||
|
* 得到子级数组
|
|||
|
* @param int $pid
|
|||
|
* @return bool|array
|
|||
|
*/
|
|||
|
public function getChild($pid)
|
|||
|
{
|
|||
|
$result = [];
|
|||
|
foreach ($this->array as $key => $value) {
|
|||
|
if ($value['parent_id'] == $pid) {
|
|||
|
$result[$key] = $value;
|
|||
|
}
|
|||
|
}
|
|||
|
return $result;
|
|||
|
}
|
|||
|
|
|||
|
/**
|
|||
|
* 递归获取级别
|
|||
|
* @param int $id ID
|
|||
|
* @param array $array 所有菜单
|
|||
|
* @param int $i 所在级别
|
|||
|
* @return int
|
|||
|
*/
|
|||
|
public function getLevel($id, $array, $i = 0)
|
|||
|
{
|
|||
|
if ($array[$id]['parent_id'] == 0 || empty($array[$array[$id]['parent_id']]) || $id == $array[$id]['parent_id']) {
|
|||
|
return $i;
|
|||
|
}
|
|||
|
$i++;
|
|||
|
return self::getLevel($array[$id]['parent_id'], $array, $i);
|
|||
|
}
|
|||
|
}
|