/**分级列表部分 start */
$GLOBALS['tree']=[
'pid' =>'pid',
'id' =>'id',
'tableName' =>'tree',
];
/**
* 无限级分类树
* @$arr array 传入二维数,里面的一维数组存在父id和id
* @$pid string 父id
* @$di string id
* @return array 返回树型结构的数组(多维数组)
*/
function get_tree($arr){
$items=[];
$pid=$GLOBALS['tree']['pid'];
$id=$GLOBALS['tree']['id'];
foreach ($arr as $key => $value) {
$items[$value[$id]] = $value;
}
$tree = array(); //格式化好的树
foreach ($items as $key => $item){
if (isset($items[$item[$pid]])){
$items[$item[$pid]]['is_have_child'] = 1; //标记改元素有子元素
$items[$item[$pid]]['child'][] = &$items[$item[$id]];
}
else{
$tree[] = &$items[$item[$id]];
}
}
return $tree;
}
/**
* 给树形结构的多维数组添加属性 leval,add_str,用于分级列表显示
* @$treeArr array 多维数组(树形结构的多维数组,结合方法 get_tree() )
* @$lv number 用于记录子元素所在的层级
* @$str1 string
* @$str2 string
*/
function set_leval(&$treeArr,$lv=0,$str1=' ',$str2=' └ '){
foreach ($treeArr as $key => $value){
if (isset($value['child'])){
set_leval($treeArr[$key]['child'],$lv+1,$str1,$str2);
}
$treeArr[$key]['leval'] = $lv;
$treeArr[$key]['add_str'] = add_str($lv,$str1,$str2);
}
}
/**
* @$new_arr array 引用传入一个数组,用来组成一个新的二维数组(一个有层次的二维数组)
* @$arrTree array 树型结构的数组,多维数组,配合方法 get_tree() 使用
*/
function tree_leval(&$new_arr,$arrTree){
$pid=$GLOBALS['tree']['pid'];
$id=$GLOBALS['tree']['id'];
foreach ($arrTree as $key => $value) {
if (isset($value['child'])){
$value_copy=$value;
//$value_copy['leval']= get_id_leval($value[$id],$data);
unset($value_copy['child']);
$new_arr[]=$value_copy;
unset($value_copy);
tree_leval($new_arr,$value['child']);
}
else{
//$value['leval']= get_id_leval($value[$id],$data);
$new_arr[]=$value;
}
}
}
/**
* @$new_arr array 引用传入一个数组,用来组成一个新的二维数组(一个有层次的二维数组,不去除子元素)
* @$arrTree array 树型结构的数组,多维数组,配合方法 get_tree() 使用
*/
function tree_leval_all(&$new_arr,$arrTree){
$pid=$GLOBALS['tree']['pid'];
$id=$GLOBALS['tree']['id'];
foreach ($arrTree as $key => $value) {
if (isset($value['child'])){
$new_arr[]=$value;
tree_leval_all($new_arr,$value['child']);
}
else{
$new_arr[]=$value;
}
}
}
/**
* 获取当前id 所属的层级(与方法 tree_leval() 组合搭配使用)
* @$id_value string 当前id的值
* @$arrLv2 array 二维数组,从数据库读取的多条记录数据
* @return number
*/
function get_id_leval($id_value,&$arrLv2){
$leval=0;
$pid=$GLOBALS['tree']['pid'];
$id=$GLOBALS['tree']['id'];
get_parent($arrLv2,$id_value,$leval,$pid,$id);
return $leval-1;
}
function get_parent(&$arrLv2,$id_value,&$lv,$pid,$id){
foreach ($arrLv2 as $key => $value){
if ($value[$id]==$id_value){
$lv++;
$parent_id = $value[$pid];
foreach ($arrLv2 as $k => $v){
if ($v[$id]==$parent_id){
$parent = $v;
break;
}
}
break;
}
}
if (isset($parent[$pid]) && $parent[$pid] != $parent[$id]){
get_parent($arrLv2,$parent[$id],$lv,$pid,$id);
}
else{
return $lv;
}
}
/**
* 获取 父id 里面的所有 子id
* @$pid_value number 要查找的父id的id值
* @$data array 二维数组,从数据库读取的多条记录数据,里面的一维数组存在父id和id
* @return array 二维数组
*/
function get_all_child($pid_value,$data){
$new_arr=['temporary'=>[],'create_arr'=>[]];
$pid=$GLOBALS['tree']['pid'];
$id=$GLOBALS['tree']['id'];
if(!function_exists('gac')){
function gac($pid_value,$data,&$new_arr,$pid,$id){
foreach ($data as $key => $value) {
if ($value[$pid] == $pid_value){
$new_arr['create_arr'][]=$value;
unset($data[$key]);
if(isset($value['is_have_child'])){
foreach ($data as $k => $v){
//判断选中的是否还是另外元素的父id
if($v[$pid]==$value[$id] && $v[$pid]!=$v[$id]){
gac($value[$id],$data,$new_arr,$pid,$id);
}
}
}
}
}
}
}
gac($pid_value,$data,$new_arr,$pid,$id);
return $new_arr['create_arr'];
}
function add_str($lv,$str1=' ',$str2=' └ '){
for ($i=0,$st=''; $i < $lv; $i++) { $st.=$str1; }return $lv>0 ? $st.$str2 : '';
}
/**
* 获取多级列表
* @$id_v string id值,主要给该id值下的所有子元素设置 disabled 属性值为 1
* @$lv number 要显示的列表缩进级别
* @data array 二维数组,里面的一维数组存在父id和id
* @return array 返回有层次的二维数组
*/
function get_leval_list($id_v=1,$lv=2,$data='',$str1=' ',$str2=' └ '){
$pid=$GLOBALS['tree']['pid'];
$id=$GLOBALS['tree']['id'];
if(is_array($data)){
foreach ($data as $key => $value) {
if($value[$id]==$id_v){
$table_data=$value;
break;
}
}
unset($key,$value);
}
//生成新的拥有层次的二维数组 ( $new_arr )
$new_arr=[];
$treeArr = get_tree($data);
set_leval($treeArr,0,$str1,$str2);
tree_leval_all($new_arr, $treeArr);
//筛选要渲染的元素(下面只显示二级缩进 列表)
foreach ($new_arr as $key => $value) {
if ($value['leval'] > $lv){
unset($new_arr[$key]);
}
}
//获取该元素的子元素 id(type_id)一维数组
if (isset($table_data[$id])){
foreach ($new_arr as $k => $v){
if($v[$id] == $table_data[$id]){
$treeArr1 = $v;
}
}
tree_leval($new_arr1,[$treeArr1]);
$child_arr['c'] = $new_arr1;
foreach ($child_arr['c'] as $key => $value) {
$child_arr['n'][] = $value[$id];
}
isset($child_arr['n']) or ($child_arr['n']=[]);
//给新数组添加属性方便前台模板渲染
foreach ($new_arr as $key => $value) {
$new_arr[$key]['add_str'] = add_str($value['leval'],$str1,$str2);
$new_arr[$key]['disabled']= in_array($value[$id],$child_arr['n']) ? 1 : 0;
}
unset($child_arr);
}
else{
foreach ($new_arr as $key => $value) {
$new_arr[$key]['add_str'] = add_str($value['leval'],$str1,$str2);
}
}
unset($treeArr,$child_arr,$table_data,$new_arr1);
return $new_arr;
}
/**
* 获取某个父id的分级列表
* @$pid_value number 父id值
* @$lv number 要显示的列表缩进级别
* @data array 二维数组,里面的一维数组存在父id和id
* @return array 返回有层次的二维数组
*/
function get_parent_leval_list($pid_value,$lv=2,$data=array(),$str1=' ',$str2=' └ '){
$new_data = get_all_child($pid_value,$data);
$id = $GLOBALS['tree']['id'];
foreach ($data as $key => $value) {
if ($value[$id] == $pid_value){
$new_data[] = $value;
break;
}
}
return get_leval_list($pid_value,$lv,$new_data,$str1,$str2);
}
/**
* 返回数组的维度
* @$arr array 数组
* @return number 数组的维度
*/
function arrayLevel($arr){
$al = array(0);
if(!function_exists('aL')){
function aL($arr,&$al,$level=0){
if(is_array($arr)){
$level++;
$al[] = $level;
foreach($arr as $k => $v){
aL($v,$al,$level);
}
}
}
}
aL($arr,$al);
return max($al);
}
/**分级列表部分 end */
数据表结构代码
CREATE TABLE `fwf_configs` (
`id` bigint(19) NOT NULL AUTO_INCREMENT,
`pid` bigint(19) DEFAULT '0' COMMENT '父id',
`block` varchar(300) COLLATE utf8_bin DEFAULT '0,' COMMENT '区块,(pid1,pid2,pid3...),方便查询',
`name` varchar(50) COLLATE utf8_bin DEFAULT NULL COMMENT '配置名称',
`title` varchar(50) COLLATE utf8_bin DEFAULT NULL COMMENT '配置标题',
`describe` varchar(255) COLLATE utf8_bin DEFAULT NULL COMMENT '配置描述',
`status` int(1) DEFAULT '1' COMMENT '配置状态,0=禁用,1=允许',
`order` int(11) DEFAULT '0' COMMENT '排序',
`url` varchar(255) COLLATE utf8_bin DEFAULT NULL COMMENT '配置链接地址',
`cover` varchar(255) COLLATE utf8_bin DEFAULT NULL COMMENT '配置封面图片地址',
`add_time` timestamp NULL DEFAULT NULL COMMENT '添加时间',
`update_time` timestamp NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
`expand_field` text COLLATE utf8_bin COMMENT '拓展字段,如保存php序列化数据字符串',
PRIMARY KEY (`id`)
) ENGINE=MyISAM AUTO_INCREMENT=37 DEFAULT CHARSET=utf8 COLLATE=utf8_bin COMMENT='多级配置列表';