首页 > php教程 > php手册 > 正文

递归的一些应用(二)无限极分类

WBOY
发布: 2016-08-08 08:49:46
原创
806 人浏览过

用递归的方法实现无限极分类

通常我在写项目的时候,在写一些例如商城分类的时候会实现对应分类的上级分类,或者其它项目部门管理上级部门的时候一般就会用到无限极分类来进行分类

第一步:首先在数据表设计的时候,如果要实现无限极分类,一般我会在数据表多添加一个字段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');

数据表:

 

数据表大概就是这样。

第二步:进入正题,无限极分类

<span style="color: #000000;">php
</span><span style="color: #008000;">//</span><span style="color: #008000;">设置字符集</span>
header(<span style="color: #800000;">'</span><span style="color: #800000;">content-type:text/html;charset=utf-8</span><span style="color: #800000;">'</span><span style="color: #000000;">);

</span><span style="color: #008000;">/*</span><span style="color: #008000;">*
 * 无限极分类
 * @param   $list array()
 * return array
 </span><span style="color: #008000;">*/</span>
<span style="color: #008000;">//</span><span style="color: #008000;">无限极分类,实现具有父子关系的数据分类</span>
function category($arr,$pid=<span style="color: #800080;">0</span>,$level=<span style="color: #800080;">0</span><span style="color: #000000;">){
    </span><span style="color: #008000;">//</span><span style="color: #008000;">定义一个静态变量,存储一个空数组,用静态变量,是因为静态变量不会被销毁,会保存之前保留的值,普通变量在函数结束时,会死亡,生长周期函数开始到函数结束,再次调用重新开始生长
    </span><span style="color: #008000;">//</span><span style="color: #008000;">保存一个空数组</span>
    <span style="color: #0000ff;">static</span> $list=<span style="color: #000000;">array();
    </span><span style="color: #008000;">//</span><span style="color: #008000;">通过遍历查找是否属于顶级父类,pid=0为顶级父类,</span>
    <span style="color: #0000ff;">foreach</span>($arr <span style="color: #0000ff;">as</span><span style="color: #000000;"> $value){
        </span><span style="color: #008000;">//</span><span style="color: #008000;">进行判断如果pid=0,那么为顶级父类,放入定义的空数组里</span>
        <span style="color: #0000ff;">if</span>($value[<span style="color: #800000;">'</span><span style="color: #800000;">pid</span><span style="color: #800000;">'</span>]==<span style="color: #000000;">$pid){
            </span><span style="color: #008000;">//</span><span style="color: #008000;">添加空格进行分层</span>
            $arr[<span style="color: #800000;">'</span><span style="color: #800000;">level</span><span style="color: #800000;">'</span>]=<span style="color: #000000;">$level;
            $list[]</span>=<span style="color: #000000;">$value;
            </span><span style="color: #008000;">//</span><span style="color: #008000;">递归点,调用自身,把顶级父类的主键id作为父类进行再调用循环,空格+1</span>
            category($arr,$value[<span style="color: #800000;">'</span><span style="color: #800000;">id</span><span style="color: #800000;">'</span>],$level+<span style="color: #800080;">1</span><span style="color: #000000;">);
        }
    }
    </span><span style="color: #0000ff;">return</span> $list;<span style="color: #008000;">//</span><span style="color: #008000;">递归出口</span>
}
登录后复制

 

连接数据:

 

效果:

 

2.一个小扩展:

 

这只是我自己理解的无限极分类,对于自己知识点的一些总结。有不妥的地方大家希望大家给些建议,共同学习,共同进步。thanks~

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
热门推荐
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责声明 Sitemap
PHP中文网:公益在线PHP培训,帮助PHP学习者快速成长!