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

89 lines
2.4 KiB
PHTML

2 years ago
<?php
namespace Common\Model;
/**
* 生成多层树状下拉选框的工具模型
*/
class TreeModel {
/**
* 把返回的数据集转换成Tree
* @access public
* @param array $list 要转换的数据集
* @param string $pid parent标记字段
* @param string $level level标记字段
* @return array
*/
public function toTree($list=null, $pk='id',$pid = 'pid',$child = '_child'){
if(null === $list) {
// 默认直接取查询返回的结果集合
$list = &$this->dataList;
}
// 创建Tree
$tree = array();
if(is_array($list)) {
// 创建基于主键的数组引用
$refer = array();
foreach ($list as $key => $data) {
$_key = is_object($data)?$data->$pk:$data[$pk];
$refer[$_key] =& $list[$key];
}
foreach ($list as $key => $data) {
// 判断是否存在parent
$parentId = is_object($data)?$data->$pid:$data[$pid];
$is_exist_pid = false;
foreach($refer as $k=>$v){
if($parentId==$k){
$is_exist_pid = true;
break;
}
}
if ($is_exist_pid) {
if (isset($refer[$parentId])) {
$parent =& $refer[$parentId];
$parent[$child][] =& $list[$key];
}
} else {
$tree[] =& $list[$key];
}
}
}
return $tree;
}
/**
* 将格式数组转换为树
*
* @param array $list
* @param integer $level 进行递归时传递用的参数
*/
private $formatTree; //用于树型数组完成递归格式的全局变量
private function _toFormatTree($list,$level=0,$title = 'title') {
foreach($list as $key=>$val){
$tmp_str=str_repeat("&nbsp;",$level*2);
$tmp_str.="└";
$val['level'] = $level;
$val['title_show'] =$level==0?$val[$title]."&nbsp;":$tmp_str.$val[$title]."&nbsp;";
// $val['title_show'] = $val['id'].'|'.$level.'级|'.$val['title_show'];
if(!array_key_exists('_child',$val)){
array_push($this->formatTree,$val);
}else{
$tmp_ary = $val['_child'];
unset($val['_child']);
array_push($this->formatTree,$val);
$this->_toFormatTree($tmp_ary,$level+1,$title); //进行下一层递归
}
}
return;
}
public function toFormatTree($list,$title = 'title',$pk='id',$pid = 'pid',$root = 0){
$list = list_to_tree($list,$pk,$pid,'_child',$root);
$this->formatTree = array();
$this->_toFormatTree($list,0,$title);
return $this->formatTree;
}
}
?>