用递归的方法实现无限极分类
通常我在写项目的时候,在写一些例如商城分类的时候会实现对应分类的上级分类,或者其它项目部门管理的上级部门的时候一般就会用到无限极分类来进行分类
第一步:首先在数据表设计的时候,如果要实现无限极分类,一般我会在数据表多添加一个字段pid,下面我通过一张新建的数据表来说明一下,
(1)建表:
-- ----------------------------
-- Table structure for pid
-- ----------------------------
DROP TABLE IF EXISTS `pid`;
CREATE TABLE pid (
id tinyint unsigned NOT NULL AUTO_INCREMENT primary key comment '主键id',
name varchar(32) NOT NULL,
nickname varchar(32) DEFAULT NULL,
pid tinyint(10) unsigned DEFAULT NULL,
sort mediumint(10) unsigned DEFAULT 50
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
(2)插入数据:
-- ----------------------------
-- Records of pid
-- ----------------------------
INSERT INTO `pid` VALUES ('1', '科技', '', '0', '50');
INSERT INTO `pid` VALUES ('2', '军事', '', '0', '50');
INSERT INTO `pid` VALUES ('3', '人与自然', '', '0', '50');
INSERT INTO `pid` VALUES ('4', '美食', '', '0', '50');
INSERT INTO `pid` VALUES ('5', '人工智能', '', '1', '50');
INSERT INTO `pid` VALUES ('6', '机器人', '', '5', '50');
INSERT INTO `pid` VALUES ('7', '无人飞机', '', '5', '50');
INSERT INTO `pid` VALUES ('8', '无人汽车', '', '5', '50');
INSERT INTO `pid` VALUES ('9', '军事机器人', '哈哈', '6', '50');
INSERT INTO `pid` VALUES ('10', '服务机器人', '', '6', '50');
INSERT INTO `pid` VALUES ('11', '航母', '', '2', '50');
INSERT INTO `pid` VALUES ('12', '舰载机', '', '2', '50');
INSERT INTO `pid` VALUES ('13', '预警机', '', '2', '50');
INSERT INTO `pid` VALUES ('14', '导弹', '', '2', '50');
INSERT INTO `pid` VALUES ('15', '舌尖上的中国', '', '3', '50');
INSERT INTO `pid` VALUES ('16', '川菜', '', '15', '50');
INSERT INTO `pid` VALUES ('17', '粤菜', '', '15', '50');
INSERT INTO `pid` VALUES ('18', '湘菜', '', '15', '50');
INSERT INTO `pid` VALUES ('19', '生物', '', '4', '50');
INSERT INTO `pid` VALUES ('20', '动物', '', '19', '50');
INSERT INTO `pid` VALUES ('21', '植物', '', '19', '50');
INSERT INTO `pid` VALUES ('26', '哈哈', '哈哈', '0', '50');
INSERT INTO `pid` VALUES ('27', '嘿嘿嘿', '嘿嘿嘿', '26', '50');
INSERT INTO `pid` VALUES ('28', '嘘嘘嘘', '嘘嘘嘘', '26', '50');
数据表:
数据表大概就是这样。
第二步:进入正题,无限极分类
<?php //设置字符集 header('content-type:text/html;charset=utf-8'); /** * 无限极分类 * @param $list array() * return array */ //无限极分类,实现具有父子关系的数据分类 function category($arr,$pid=0,$level=0){ //定义一个静态变量,存储一个空数组,用静态变量,是因为静态变量不会被销毁,会保存之前保留的值,普通变量在函数结束时,会死亡,生长周期函数开始到函数结束,再次调用重新开始生长 //保存一个空数组 static $list=array(); //通过遍历查找是否属于顶级父类,pid=0为顶级父类, foreach($arr as $value){ //进行判断如果pid=0,那么为顶级父类,放入定义的空数组里 if($value['pid']==$pid){ //添加空格进行分层 $arr['level']=$level; $list[]=$value; //递归点,调用自身,把顶级父类的主键id作为父类进行再调用循环,空格+1 category($arr,$value['id'],$level+1); } } return $list;//递归出口 }
连接数据:
效果:
2.一个小扩展:
这只是我自己理解的无限极分类,对于自己知识点的一些总结。有不妥的地方大家希望大家给些建议,共同学习,共同进步。thanks~
------------------------------------------------------------------------------------------------------------------
PHP实现无限极分类
本文章向大家介绍PHP实现无限极分类,主要包括PHP实现无限极分类使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
$array = array( array('id' => 1, 'pid' => 0, 'name' => '河北省'), array('id' => 2, 'pid' => 0, 'name' => '北京市'), array('id' => 3, 'pid' => 1, 'name' => '邯郸市'), array('id' => 4, 'pid' => 2, 'name' => '朝阳区'), array('id' => 5, 'pid' => 2, 'name' => '通州区'), array('id' => 6, 'pid' => 4, 'name' => '望京'), array('id' => 7, 'pid' => 4, 'name' => '酒仙桥'), array('id' => 8, 'pid' => 3, 'name' => '永年区'), array('id' => 9, 'pid' => 1, 'name' => '武安市'), );
/** * 递归实现无限极分类 * @param $array 分类数据 * @param $pid 父ID * @param $level 分类级别 * @return $list 分好类的数组 直接遍历即可 $level可以用来遍历缩进 */ function getTree($array, $pid =0, $level = 0){ //声明静态数组,避免递归调用时,多次声明导致数组覆盖 static $list = []; foreach ($array as $key => $value){ //第一次遍历,找到父节点为根节点的节点 也就是pid=0的节点 if ($value['pid'] == $pid){ //父节点为根节点的节点,级别为0,也就是第一级 $value['level'] = $level; //把数组放到list中 $list[] = $value; //把这个节点从数组中移除,减少后续递归消耗 unset($array[$key]); //开始递归,查找父ID为该节点ID的节点,级别则为原级别+1 getTree($array, $value['id'], $level+1); } } return $list; } /* * 获得递归完的数据,遍历生成分类 */ $array = getTree($array); foreach($array) as $value{ echo str_repeat('--', $value['level']), $value['name'].'<br />'; } //输出结果 无限极分类实现ok 河北省 --邯郸市 ----永年区 --武安市 北京市 --朝阳区 ----望京 ----酒仙桥 --通州区