php,无限分类函数

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内容生成、新媒体营销和短视频营销等业务的公司。我们拥有一支优秀的团队,专门致力于为客户提供优质的服务。

我们致力于为客户提供一站式的互联网营销服务,帮助客户在激烈的市场竞争中获得更大的优势和发展机会!

点赞(18) 打赏

评论列表 共有 0 条评论

暂无评论
立即
投稿
发表
评论
返回
顶部