php无限极分类,这个问题真的很经典。在做上一个项目时,我便被安排了做无限极分类,当时,因为赶工,并且只是用作后台管理无限极添加菜单,虽然实现了,但是,每生成一次子菜单,都要去数据库查询一次…今天,在之前实现的基础上,稍稍改进,只查询一次数据库,并分成了option(后台管理)和ul(前台页面)的方式便利出来…
数据库设计:
CREATE TABLE `category` (
`id` int(11) NOT NULL AUTO_INCREMENT COMMENT ‘自增id’,
`name` varchar(32) NOT NULL COMMENT ‘分类名称’,
`code` varchar(32) NOT NULL COMMENT ‘分类代码’,
`parent_id` int(11) NOT NULL DEFAULT ‘0’ COMMENT ‘父分类’,
`created_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT ‘创建时间’,
PRIMARY KEY (`id`),
UNIQUE KEY `idx_name` (`name`) USING BTREE
) ENGINE=InnoDB AUTO_INCREMENT=18 DEFAULT CHARSET=utf8;
这个无限极分类,还是基于递归思想实现。
1、首先遍历从数据库中取出来的二维数组$menu,输出parent_id键值为0的,即是最顶级菜单。
2、调用sub()方法,输出该菜单下的所有子级菜单。(把该菜单的id传进去,sub方法再一次便利$menu二维数组,判断输出parent_id键值为此id的子菜单,然后递归调用sub()方法,传入本菜单的id…依此循环输出所有子菜单)
[code] option风格便利
<?php
$conn = mysql_connect(‘localhost’,’root’,’604123858′);
mysql_select_db(‘test’,$conn);
mysql_query(“set names utf8″);
$res = mysql_query(“select * from category”);
while($row = mysql_fetch_assoc($res))
{
$menu[] = $row;
}
echo ‘<select>';
foreach($menu as $k => $v)
{
if($v[‘parent_id’] == 0){
echo ‘<option value=’.$v[‘id’].’>’.$v[‘name’].'</option>';
sub($v[‘id’],’–‘);
}
}
echo ‘</select>';
function sub($id,$tag)
{
global $menu;
foreach($menu as $k => $v)
{//echo $id;die;
if($id == $v[‘parent_id’]){
echo ‘<option>’.$tag.$v[‘name’].'</option>';
sub($v[‘id’],’–‘.$tag);
}
}
}
?>
[/code]
[code]ul风格便利
<?php
$conn = mysql_connect(‘localhost’,’root’,’604123858′);
mysql_select_db(‘test’,$conn);
mysql_query(“set names utf8″);
$res = mysql_query(“select * from category”);
while($row = mysql_fetch_assoc($res))
{
$menu[] = $row;
}
echo ‘<ul>';
foreach($menu as $k => $v)
{
if($v[‘parent_id’] == 0){
echo ‘<li>’.$v[‘name’];
sub($v[‘id’],”);
}
}
echo ‘</ul>';
function sub($id)
{
echo “<ol>”;
global $menu;
foreach($menu as $k => $v)
{//echo $id;die;
if($id == $v[‘parent_id’]){
echo ‘<li>’.$v[‘name’].'</li>';
sub($v[‘id’]);
echo ‘</li>';
}
}
echo ‘</ol>';
echo “</li>”;
}
?>
[/code]