作者:北辰孤星123 | 来源:互联网 | 2024-12-22 12:29
在众多管理系统中,如菜单、分类和部门等模块,通常需要处理层级结构。为了高效管理和展示这些层级数据,本文将介绍如何使用PHP实现多级树形结构,并提供代码示例以帮助开发者轻松实现无限分级。
在许多管理系统的开发中,层级结构是常见需求,例如菜单、分类和部门等模块。这些对象通常保存在数据库中,并通过一个父级 ID(pid
)字段来表示层级关系。然而,在从数据库中查询出对象列表后,如何重新恢复其层级关系呢?以下是两个实用的函数,可以帮助你实现这一目标。
首先,我们来看一个用于数组层级缩进转换的函数:
/**
* 数组层级缩进转换
* @param array $array 源数组
* @param int $pid 父级ID,默认为0
* @param int $level 当前层级,默认为1
* @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;
}
该函数递归地遍历数组,根据 pid
字段构建层级结构,并为每个元素添加层级信息。获取数据后的效果如下图所示:
接下来,我们介绍一个更复杂的函数,用于构建完整的树状数组:
/**
* 构建层级(树状)数组
* @param array $array 要进行处理的一维数组,经过该函数处理后,该数组自动转为树状数组
* @param string $pid_name 父级ID的字段名,默认为'pid'
* @param string $child_key_name 子元素键名,默认为'children'
* @return array|bool 返回树状数组或false
*/
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;
}
该函数通过多次迭代,逐步构建出完整的树状结构。最终结果如下图所示:
以上代码片段展示了如何在 PHP 中实现多级树形结构,帮助开发者更高效地管理和展示层级数据。通过这两个函数,你可以轻松实现无限分级的功能,适用于各种管理系统的开发需求。