下面是详细的“PHP递归实现层级树状展开”的完整攻略:
什么是递归?
递归是一种计算机科学的基础概念,指的是在函数的定义里面又调用了该函数自身的行为。递归可以使算法变得简单且易于理解,但是如果没有终止条件或者递归深度过大,会导致内存资源的浪费或者栈溢出等问题。
什么是层级树状结构?
层级树状结构是一种常见的数据结构,它是由多个节点组成的树形结构,每个节点可以拥有零个或多个子节点。每个节点除了它所在的层级外,还可以拥有一个父节点或根节点。它是一种非常灵活且广泛应用的数据结构,常用于组织管理架构、商品类别、地区等。
实现层级树状展开的步骤
-
定义数据模型:首先需要定义一个层级树形数据模型,用来存储所有节点的信息。比如,节点的 ID、父节点的 ID、节点的名称等等。可以使用关系型数据库的表格来存储数据,也可以使用数组来存储数据。
-
获取数据:从数据库或者从文件中获取数据,然后将数据存储到数据模型中。
-
递归展开:定义一个递归函数,根据当前节点的 ID 来递归查询它的子节点,并将它的子节点添加到结果数组中。如果当前节点没有子节点,函数将会返回。递归函数需要注意终止条件,防止无限循环。
-
输出结果:最后将结果数组以一定的层级结构(如 HTML 的无序列表)输出到页面上,进行展示。
示例一
下面是一个商品类别的层级树状结构,其中每个节点都可以拥有多个子节点。我们可以使用递归来展开这个层级树状结构。假设数据模型存储在数据库中,这里的示例使用 MySQL 数据库。
- 数据库表格的结构:
CREATE TABLE `category` (
`id` int(11) unsigned NOT NULL AUTO_INCREMENT,
`parent_id` int(11) unsigned NOT NULL DEFAULT '0',
`name` varchar(255) NOT NULL DEFAULT '',
PRIMARY KEY (`id`)
);
- 数据库中的数据:
INSERT INTO `category` (`id`, `parent_id`, `name`)
VALUES
(1, 0, '电器'),
(2, 1, '冰箱'),
(3, 1, '电视'),
(4, 2, '三门冰箱'),
(5, 2, '双门冰箱'),
(6, 3, '液晶电视'),
(7, 3, '曲面电视'),
(8, 4, '海尔三门冰箱'),
(9, 5, '海尔双门冰箱'),
(10, 6, '索尼液晶电视'),
(11, 7, '小米曲面电视');
- 实现递归函数:
function getChildren($parent_id)
{
$result = array();
$sql = "SELECT * FROM `category` WHERE `parent_id`={$parent_id}";
$query = mysql_query($sql);
while ($row = mysql_fetch_assoc($query)) {
$children = getChildren($row['id']);
if (!empty($children)) {
$row['children'] = $children;
}
$result[] = $row;
}
return $result;
}
上述代码定义了一个递归函数 getChildren(),用来获取某个节点的所有子节点。递归过程中,如果当前节点有子节点,递归查询子节点,并将子节点添加到当前节点的 children 字段中。
- 输出结果:
$result = getChildren(0);
function outputList($data)
{
echo "<ul>";
foreach ($data as $item) {
echo "<li>".$item['name'];
if (!empty($item['children'])) {
outputList($item['children']);
}
echo "</li>";
}
echo "</ul>";
}
outputList($result);
上述代码定义了一个递归函数 outputList(),用来将结果数组以 HTML 的无序列表形式展示。递归过程中,如果当前节点有子节点,递归查询并输出子节点。
输出结果如下:
- 电器
- 冰箱
- 三门冰箱
海尔三门冰箱
- 双门冰箱
海尔双门冰箱
- 电视
- 液晶电视
索尼液晶电视
- 曲面电视
小米曲面电视
示例二
下面是一个地区的层级树状结构,其中每个节点都可以拥有多个子节点。我们同样可以使用递归来展开这个层级树状结构。假设数据模型存储在一个多维数组中,这里的示例使用 PHP 数组。
- PHP 数组的结构:
$data = array(
array('id' => 1, 'parent_id' => 0, 'name' => '中国'),
array('id' => 2, 'parent_id' => 1, 'name' => '北京市'),
array('id' => 3, 'parent_id' => 1, 'name' => '上海市'),
array('id' => 4, 'parent_id' => 2, 'name' => '东城区'),
array('id' => 5, 'parent_id' => 2, 'name' => '西城区'),
array('id' => 6, 'parent_id' => 3, 'name' => '黄浦区'),
array('id' => 7, 'parent_id' => 3, 'name' => '徐汇区'),
);
- 实现递归函数:
function getChildren($parent_id, $data)
{
$result = array();
foreach ($data as $item) {
if ($item['parent_id'] == $parent_id) {
$children = getChildren($item['id'], $data);
if (!empty($children)) {
$item['children'] = $children;
}
$result[] = $item;
}
}
return $result;
}
上述代码定义了一个递归函数 getChildren(),用来获取某个节点的所有子节点。递归过程中,如果当前节点有子节点,递归查询子节点,并将子节点添加到当前节点的 children 字段中。
- 输出结果:
$result = getChildren(0, $data);
function outputList($data)
{
echo "<ul>";
foreach ($data as $item) {
echo "<li>".$item['name'];
if (!empty($item['children'])) {
outputList($item['children']);
}
echo "</li>";
}
echo "</ul>";
}
outputList($result);
同样,输出结果展示的方法与示例一相同。
输出结果如下:
- 中国
- 北京市
- 东城区
- 西城区
- 上海市
- 黄浦区
- 徐汇区
以上就是“PHP递归实现层级树状展开”的完整攻略,希望对您有所帮助。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:PHP递归实现层级树状展开 - Python技术站