PHP常用的分类树形结构 可实现无限分级

admin 阅读:96 2024-03-01

在很多系统中会有层级体系,特别是在各种管理系统的菜单、分类、部门等相关模块。一般而言,系统都会把这些对象保存在数据库中,并用一个pid字段去记录该对象的父级对象。那么问题来了,当从数据库中重新查出对象列表后,如何重新恢复其层级关系呢?下面的这个函数可以帮到你:

/**
 * 数组层级缩进转换
 * @param array $array 源数组
 * @param int   $pid
 * @param int   $level
 * @return array
 */
function array2level($array, $pid = 0, $level = 1) {
    static $list = [];
    foreach ($array as $v) {
        if ($v['pid'] == $pid) {
            $v['level'] = $level;
            $list[] = $v;
            array2level($array, $v['id'], $level + 1);
        }
    }
    return $list;
}

获取数据如下图:

数据图

使用效果如下图:

效果图

/**
 * 构建层级(树状)数组
 * @param array  $array          要进行处理的一维数组,经过该函数处理后,该数组自动转为树状数组
 * @param string $pid_name       父级ID的字段名
 * @param string $child_key_name 子元素键名
 * @return array|bool
 */
function array2tree(&$array, $pid_name = 'pid', $child_key_name = 'children') {
    $counter = array_children_count($array, $pid_name);
    if (!isset($counter[0]) || $counter[0] == 0) {
        return $array;
    }
    $tree = [];
    while (isset($counter[0]) && $counter[0] > 0) {
        $temp = array_shift($array);
        if (isset($counter[$temp['id']]) && $counter[$temp['id']] > 0) {
            array_push($array, $temp);
        } else {
            if ($temp[$pid_name] == 0) {
                $tree[] = $temp;
            } else {
                $array = array_child_append($array, $temp[$pid_name], $temp, $child_key_name);
            }
        }
        $counter = array_children_count($array, $pid_name);
    }
    return $tree;
}

获取数据如下图:

数据图

使用效果如下图:

效果图

声明

1、部分文章来源于网络,仅作为参考。
2、如果网站中图片和文字侵犯了您的版权,请联系1943759704@qq.com处理!