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提供的算法具有更高的性能。