PHP的分级列表函数部分

方文锋  2020-03-30 09:07:44  1152  首页学习PHP

 /**分级列表部分 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='&nbsp;&nbsp;&nbsp;&nbsp;',$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='&nbsp;&nbsp;&nbsp;&nbsp;',$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='多级配置列表';