CMSPRESS 10行代码搞定 PHP无限级分类2

1. 引言

无限级分类是指商品类别、新闻分类等树状结构数据中,每一项都可以无限地向下嵌套子项,是Web开发中经常用到的一种常见场景。在PHP中,我们可以使用递归来实现无限级分类,然而递归算法的性能问题一直是开发者们面临的难题。针对这个问题,CMSPRESS提供了一种仅需10行代码就能搞定PHP无限级分类的方法,让我们来一起看看!

2. 步骤

2.1 数据表结构

在本文中,我们使用如下的数据表结构:

CREATE TABLE `category` (

`id` int(11) NOT NULL AUTO_INCREMENT,

`name` varchar(255) NOT NULL,

`parent_id` int(11) NOT NULL DEFAULT '0',

PRIMARY KEY (`id`)

) ENGINE=MyISAM DEFAULT CHARSET=utf8;

其中,id为分类ID,name为分类名称,parent_id为父级分类ID(当parent_id为0时,则为一级分类)。

2.2 代码实现

我们将无限级分类的实现封装成一个函数:

function categoryTree($dataset) {

$tree = array();

foreach ($dataset as $id => &$node) {

if (!$node['parent_id']) {

$tree[$id] = &$node;

} else {

$dataset[$node['parent_id']]['children'][$id] = &$node;

}

}

return $tree;

}

此函数接受一个无限级分类的数据集,返回一个以树状结构组织的分类数组。

现在我们只需要从数据库获取所有分类数据,然后传递给categoryTree函数即可:

$result = mysqli_query($conn, 'SELECT * FROM category');

$dataset = array();

while ($row = mysqli_fetch_assoc($result)) {

$dataset[$row['id']] = $row;

}

$tree = categoryTree($dataset);

3. 性能对比

将递归算法与CMSPRESS提供的无限级分类方法进行性能对比,我们可以得到如下实验结果:

// 递归算法实现无限级分类

function getTree($dataset, $parentId = 0, $level = 0) {

$tree = array();

foreach ($dataset as $id => $node) {

if ($node['parent_id'] == $parentId) {

$node['level'] = $level;

$node['children'] = getTree($dataset, $id, $level + 1);

$tree[] = $node;

}

}

return $tree;

}

// 测试数据

$dataset = array();

for ($i = 1; $i <= 100; $i++) {

$dataset[$i] = array(

'id' => $i,

'name' => '分类' . $i,

'parent_id' => rand(0, $i - 1)

);

}

// 用递归算法计算无限级分类的执行时间

$start = microtime(true);

getTree($dataset);

echo 'Recursive Total time: ' . round(microtime(true) - $start, 5) . 's';

// 用CMSPRESS算法计算无限级分类的执行时间

$start = microtime(true);

categoryTree($dataset);

echo 'CMSPRESS Total time: ' . round(microtime(true) - $start, 5) . 's';

实验结果表明,递归算法实现无限级分类的执行时间远远高于CMSPRESS提供的算法。因此,在需要频繁使用无限级分类的场景下,CMSPRESS提供的算法具有更高的性能。

后端开发标签