PHP 无限分类实现
在开发过程中,很多情况下需要处理无限分类数据,如:新闻分类、产品分类等。其实 PHP 处理无限分类数据有多种方法,这篇文章主要介绍两种方式:递归和迭代。
递归方式实现无限分类
递归是指函数自己调用自己,在处理无限分类数据时也是如此,即:函数自己调用自己来处理子分类。
例如有如下无限级分类数据:
```php
$data = [
['id' => 1, 'name' => '分类1', 'parent_id' => 0],
['id' => 2, 'name' => '分类2', 'parent_id' => 0],
['id' => 3, 'name' => '分类1.1', 'parent_id' => 1],
['id' => 4, 'name' => '分类1.2', 'parent_id' => 1],
['id' => 5, 'name' => '分类2.1', 'parent_id' => 2],
['id' => 6, 'name' => '分类1.1.1', 'parent_id' => 3],
['id' => 7, 'name' => '分类1.1.2', 'parent_id' => 3],
['id' => 8, 'name' => '分类2.1.1', 'parent_id' => 5],
['id' => 9, 'name' => '分类1.1.2.1', 'parent_id' => 7],
];
```
递归方式实现的无限分类函数代码如下:
```php
function buildTree($data, $parent_id = 0, $level = 0)
{
static $result = [];
foreach ($data as $item) {
if ($item['parent_id'] == $parent_id) {
$item['level'] = $level;
$result[] = $item;
buildTree($data, $item['id'], $level + 1);
}
}
return $result;
}
```
该函数的主要作用是遍历分类数组,将分类按层级关系组合成多维数组,其中 $parent_id 变量表示父级分类 ID,$level 变量表示分类所在的层级。
变量 $result 用来存储结果,由于该函数会多次执行,为了不重复覆盖数组,需要使用 static 关键字。
测试该函数:
```php
$data = [
['id' => 1, 'name' => '分类1', 'parent_id' => 0],
['id' => 2, 'name' => '分类2', 'parent_id' => 0],
['id' => 3, 'name' => '分类1.1', 'parent_id' => 1],
['id' => 4, 'name' => '分类1.2', 'parent_id' => 1],
['id' => 5, 'name' => '分类2.1', 'parent_id' => 2],
['id' => 6, 'name' => '分类1.1.1', 'parent_id' => 3],
['id' => 7, 'name' => '分类1.1.2', 'parent_id' => 3],
['id' => 8, 'name' => '分类2.1.1', 'parent_id' => 5],
['id' => 9, 'name' => '分类1.1.2.1', 'parent_id' => 7],
];
$result = buildTree($data);
print_r($result);
```
输出结果:
```
Array
(
[0] => Array
(
[id] => 1
[name] => 分类1
[parent_id] => 0
[level] => 0
)
[1] => Array
(
[id] => 3
[name] => 分类1.1
[parent_id] => 1
[level] => 1
)
[2] => Array
(
[id] => 6
[name] => 分类1.1.1
[parent_id] => 3
[level] => 2
)
[3] => Array
(
[id] => 7
[name] => 分类1.1.2
[parent_id] => 3
[level] => 2
)
[4] => Array
(
[id] => 9
[name] => 分类1.1.2.1
[parent_id] => 7
[level] => 3
)
[5] => Array
(
[id] => 4
[name] => 分类1.2
[parent_id] => 1
[level] => 1
)
[6] => Array
(
[id] => 2
[name] => 分类2
[parent_id] => 0
[level] => 0
)
[7] => Array
(
[id] => 5
[name] => 分类2.1
[parent_id] => 2
[level] => 1
)
[8] => Array
(
[id] => 8
[name] => 分类2.1.1
[parent_id] => 5
[level] => 2
)
)
```
迭代方式实现无限分类
迭代方式实现无限分类相对于递归方式更高效,因为避免了递归调用过程中保存和跟踪对同一子树的多次计算,而是通过循环实现。
例如有如下无限级分类数据:
```php
$data = [
['id' => 1, 'name' => '分类1', 'parent_id' => 0],
['id' => 2, 'name' => '分类2', 'parent_id' => 0],
['id' => 3, 'name' => '分类1.1', 'parent_id' => 1],
['id' => 4, 'name' => '分类1.2', 'parent_id' => 1],
['id' => 5, 'name' => '分类2.1', 'parent_id' => 2],
['id' => 6, 'name' => '分类1.1.1', 'parent_id' => 3],
['id' => 7, 'name' => '分类1.1.2', 'parent_id' => 3],
['id' => 8, 'name' => '分类2.1.1', 'parent_id' => 5],
['id' => 9, 'name' => '分类1.1.2.1', 'parent_id' => 7],
];
```
迭代方式实现的无限分类函数代码如下:
```php
function buildTree($arr)
{
$tree = [];
$refer = [];
foreach ($arr as $key => $value) {
$refer[$value['id']] = &$arr[$key];
}
foreach ($arr as $key => $value) {
$parentId = $value['parent_id'];
if ($parentId === 0) {
$tree[] = &$arr[$key];
} else {
if (isset($refer[$parentId])) {
$refer[$parentId]['children'][] = &$arr[$key];
}
}
}
return $tree;
}
```
该函数的主要作用是将一维数组转化成树形结构的多维数组。在该函数中,$tree 数组用于保存树形结构,$refer 数组则用于将数组中的元素按照 id 进行引用。
测试该函数:
```php
$data = [
['id' => 1, 'name' => '分类1', 'parent_id' => 0],
['id' => 2, 'name' => '分类2', 'parent_id' => 0],
['id' => 3, 'name' => '分类1.1', 'parent_id' => 1],
['id' => 4, 'name' => '分类1.2', 'parent_id' => 1],
['id' => 5, 'name' => '分类2.1', 'parent_id' => 2],
['id' => 6, 'name' => '分类1.1.1', 'parent_id' => 3],
['id' => 7, 'name' => '分类1.1.2', 'parent_id' => 3],
['id' => 8, 'name' => '分类2.1.1', 'parent_id' => 5],
['id' => 9, 'name' => '分类1.1.2.1', 'parent_id' => 7],
];
$result = buildTree($data);
print_r($result);
```
输出结果:
```php
Array
(
[0] => Array
(
[id] => 1
[name] => 分类1
[parent_id] => 0
[children] => Array
(
[0] => Array
(
[id] => 3
[name] => 分类1.1
[parent_id] => 1
[children] => Array
(
[0] => Array
(
[id] => 6
[name] => 分类1.1.1
[parent_id] => 3
)
[1] => Array
(
[id] => 7
[name] => 分类1.1.2
[parent_id] => 3
[children] => Array
(
[0] => Array
(
[id] => 9
[name] => 分类1.1.2.1
[parent_id] => 7
)
)
)
)
)
[1] => Array
(
[id] => 4
[name] => 分类1.2
[parent_id] => 1
)
)
)
[1] => Array
(
[id] => 2
[name] => 分类2
[parent_id] => 0
[children] => Array
(
[0] => Array
(
[id] => 5
[name] => 分类2.1
[parent_id] => 2
[children] => Array
(
[0] => Array
(
[id] => 8
[name] => 分类2.1.1
[parent_id] => 5
)
)
)
)
)
)
```
注意事项
对于迭代方式实现无限分类函数,需要注意的是,在 PHP 5.5 之前的版本中,定义 $refer 数组必须使用 $refer[$value['id']] = &$arr[$key]; 的方式,否则 $refer 数组中的元素均指向最后一个元素。在 PHP 5.5 及以上版本中,可以使用等价的 $refer[$value['id']] = $arr[$key]; 的方式。
另外对于以上两种方法,在实现时需要考虑分类数据的复杂程度和数据量的大小,选择性的使用对应的方式进行处理,以提高代码的效率和性能。
总结
PHP 处理无限分类数据有多种方法,本文介绍了两种方式:递归和迭代,递归方式的实现相对简单,但是由于递归过程中需要调用函数本身,可能会产生性能上的损耗;而迭代方式实现无限分类则相对高效,更适合处理数据量较大的情况。作者建议在实际应用中,根据需要选用不同的方式进行处理,以提高代码的效率和性能。
壹涵网络我们是一家专注于网站建设、企业营销、网站关键词排名、AI内容生成、新媒体营销和短视频营销等业务的公司。我们拥有一支优秀的团队,专门致力于为客户提供优质的服务。
我们致力于为客户提供一站式的互联网营销服务,帮助客户在激烈的市场竞争中获得更大的优势和发展机会!
发表评论 取消回复