本文实例讲述了php+mysql实现无限分类的方法。分享给大家供大家参考。具体分析如下:

1、数据库通过设置父类ID来进行唯一索引,然后使用函数的递归调用实现无限分类;

2、数据库设计通过特定格式进行排列,然后使用mysql查询关键函数:concat,程序实现比较简单,首先我们假设有这样的一个三级分类,新闻→PHP新闻→PHP6.0出来了.

如果我们要查找“PHP6.0出来了”这条新闻,我们先点击新闻,然后再点击PHP新闻,就可以查出来了,也就是说我们可以通过祖父类一级一级地往下找,反过来我们只要知道一个子类的父类,就可以把它查找出来了,这样我们在设计数据库时就可以多设计一个父类id的字段就可以实现无限分类的功能了.

数据库代码如下:

这里我们建一个表"class"

CREATE TABLE `class` (

`id` int(11) NOT NULL auto_increment COMMENT '分类id',

`f_id` int(11) NOT NULL COMMENT '父id',

`name` varchar(25) collate gbk_bin NOT NULL COMMENT '分类名称',

PRIMARY KEY  (`id`)

) ENGINE=MyISAM  DEFAULT CHARSET=gbk COLLATE=gbk_bin AUTO_INCREMENT=1 ;

首先我们往数据库里插入'新闻'这个大分类,因为'新闻'是最大分类,上面没有父类了,所以我把它的f_id设置为0.

INSERT INTO `class` (`id`, `f_id`, `name`) VALUES(1, 0, '新闻');//id这个字段是自动增长的,可以不写值.

然后我们再往数据库里插入'PHP新闻'这个分类,它的父类'新闻'的id是1,所以它的f_id设置为1。

INSERT INTO `class` (`id`, `f_id`, `name`) VALUES(2, 1, 'PHP新闻');

然后我们再往数据库里插入'PHP6.0出来了'这个分类,它的父类'PHP新闻'的id是2,所以它的f_id设置为2。

INSERT INTO `class` (`id`, `f_id`, `name`) VALUES(3, 2, 'PHP6.0出来了');

同理,我们可以这样一直往下插入分类,也就达到了无限分类.

我们可以发现插入一个分类的原则关键是找到这个分类的父类的id,然后作为这个分类的f_id字段的值.

假设要插入跟'新闻'同一个级别的分类'技术',也就是说它也是最大分类,上面没有父类了,那么它的f_id也设置为0;

INSERT INTO `class` (`id`, `f_id`, `name`) VALUES(4, 0, '技术');

在'技术'下面又有一个分类'PHP技术',那么我们怎么插入呢,首先找到'PHP技术'的父类'技术'的id,然后作为自己的f_id字段的值.

INSERT INTO `class` (`id`, `f_id`, `name`) VALUES(5, 4, 'PHP技术');

看到这里,想必大家应该都明白怎么往数据库里插入各个分类了,就不再举例了,我们已经知道如何往数据库里插入各个分类了,那又如何把各个分类罗列出来呢?

php实例代码如下:

header("Content-type:text/html;charset=utf-8");

$db=new mysqli("localhost","root","","news_php100") ; //实例化一个数据库连接。使用这个前一定要确保已经加载了mysqli类库,或者用mysql_connect这个方式连接。

if(mysqli_connect_errno()){

echo "链接失败:".mysqli_connect_error();

exit(); }

$db->query("set names utf8");

$result=$db->query("select name from class where f_id=0"); //查找f_id=0的分类,也就是查找每一个大类。

while($row=$result->fetch_assoc()){

echo $row['name']."
";        //这样就把每个大类循环出来了。

}

//同样我们可以把新闻的子类循环出来。

$result=$db->query("select * from class where f_id=1"); //查找f_id=1的分类,也就是查找'新闻'的子类。

while($row=$result->fetch_assoc()){

echo $row['name']."

";        //这样就把'新闻'的子类循环出来了。注意:只是子类,不包括孙子类。

}

//写到这里,我们会发现一个问题,如果这个分类是10级分类,难道我们要写10个循环把它每个子类循环出来?如果是更多级分类呢,这样写显然是不现实的。

//那又有什么办法解决呢?我们可以写一个递归的函数,把f_id作为参数传入,不断循环每一个f_id的值,也就是说把每一个f_id值的子类循环出来。

//首先我们把各个分类的值保存在一个二维数组中,在下面的递归函数里有用。

$result=$db->query("select * from class");

while($row=$result->fetch_assoc()){

$arr[]=array($row[id],$row[f_id],$row[name]);    //每一行保存一个分类的id,f_id,name的信息。

}

function fenlei($f_id=0){     //$f_id初始化为0,也就是从最大分类开始循环.

global $arr;   //声明$arr为全局变量才可在函数里引用。

for($i=0;$i

if($arr[$i][1]==$f_id){         //$arr[$i][1]表示第$i+1个分类的f_id的值。开始$f_id=0,也就是把f_id=0的分类输出来。

echo $arr[$i][2]."
"; //$arr[$i][1]表示第$i+1个分类的name的值。

fenlei($arr[$i][0]);   //$arr[$i][1]表示第$i+1个分类的id的值。进行递归,也就是把自己的id作为f_id参数把自己的子类再循环出来。

}

}

}

?>

三个字段id,parentid,name,算法也很简单递归,以前用递归的时候很傻,应该说极傻,因为在递归中通过查询数据表来获得子类的所有,最近开窍了,想到了一个地球人都能想得到的方法,下面是代码,一个class,代码如下:

class Tree {

/**

* 从数据库查询出的所有分类信息

* @var array

*/

var $arr;

/**

* 如下格式

*  var $arr = array(

1 => array('id'=>'1','parentid'=>0,'name'=>'一级栏目一'),

2 => array('id'=>'2','parentid'=>0,'name'=>'一级栏目二'),

3 => array('id'=>'3','parentid'=>1,'name'=>'二级栏目一'),

);*/

/**

* 输出结构

* @var array

*/

var $tree = array();

/**

* 树形递归的深度

* @var int

*/

var $deep = 1;

/**

* 生成树形的修饰符号

* @var array

*/

var $icon = array('│','├','└');

/**

* 生成指定id的下级树形结构

* @param int $rootid 要获取树形结构的id

* @param string $add 递归中使用的前缀

* @param bool $parent_end 标识上级分类是否是最后一个

*/

function getTree($rootid = 0,$add = ”,$parent_end =true){

$is_top = 1;

$child_arr = $this->getChild($rootid);

if(is_array($child_arr)){

$cnt = count($child_arr);

foreach($child_arr as $key => $child){

$cid = $child['id'];

$child_child = $this->getChild($cid);

if($this->deep >1){

if($is_top == 1 && $this->deep > 1){

$space = $this->icon[1];

if(!$parent_end)

$add .=  $this->icon[0];

else $add .= '  ';

}

if($is_top == $cnt){

$space = $this->icon[2];

$parent_end = true;

}else {

$space = $this->icon[1];

$parent_end = false;

}

}

$this->tree[] = array('spacer'=>$add.$k.$space,

'name'=>$child['name'],

'id'=>$cid

);

$is_top++;

$this->deep++;

if($this->getChild($cid))

$this->getTree($cid,$add,$parent_end);

$this->deep–;

}

}

return $this->tree;

}

/**

* 获取下级分类数组

* @param int $root

*/

function getChild($root = 0){

$a = $child = array();

foreach($this->arr as $id=>$a){

if($a['parentid'] == $root){

$child[$a['id']] = $a;

}

}

return $child?$child:false;

}

/**

* 设置源数组

* @param $arr

*/

function setArr($arr = array()){

$this->arr = $arr;

}

}

?>

通过一次查询把结构保存进一个数组,再数组进行递归运算,无疑极大的提高了程序运行效率,使用代码很简单.

希望本文所述对大家的php程序设计有所帮助。

php mysql 分类_php+mysql实现无限分类实例详解相关推荐

  1. php mysql修改命令_PHP编程:mysql alter table命令修改表结构实例详解

    <PHP编程:mysql alter table命令修改表结构实例详解>要点: 本文介绍了PHP编程:mysql alter table命令修改表结构实例详解,希望对您有用.如果有疑问,可 ...

  2. mysql心得体会一百字_MYSQL CPU 100%实例详解

    MYSQL CPU 100%实例详解 2011/7/2 11:19:19作者:xy我要评论(0) 自己的一台主机(Windows 2003 + IIS + PHP + MYSQL )近来 MySQL ...

  3. mysql 过程if语句,mysql存储过程之if语句用法实例详解

    这篇文章主要介绍了mysql存储过程之if语句用法,结合实例形式详细分析了mysql存储过程中if语句相关原理.使用技巧与操作注意事项,需要的朋友可以参考下 本文实例讲述了mysql存储过程之if语句 ...

  4. mysql单个查询_MySQL单表查询实例详解

    1.准备数据 以下操作将在该表中进行 create table student ( id int unsigned primary key auto_increment, name char(12) ...

  5. MySQL中你可能忽略的COLLATION实例详解

    文章来源: 学习通http://www.bdgxy.com/ 普学网http://www.boxinghulanban.cn/ 智学网http://www.jaxp.net/ 前言 MySQL 数据库 ...

  6. 用php输出数组_PHP输出数组-打印数组实例详解

    假设有一个数组:<?php $arr=["PHP","中文","网"]; echo $arr; ?> 请问上面的代码会输出什么? ...

  7. php获取所有url地址_php 获取完整url地址实例详解

    例1,获取到地址栏的一些信息,域名,端口参数等. 复制代码 代码示例: //获取域名或主机地址 echo $_SERVER['HTTP_HOST']." "; //获取网页地址 e ...

  8. php function 返回值_PHP函数引用返回的实例详解

    引用返回 手册里是这么写的:引用返回用在当想用函数找到引用应该被绑定在哪一个变量上面时.不要用返回引用来增加性能,引擎足够聪明来自己进行优化.仅在有合理的技术原因时才返回引用!要返回引用 当你想将函数 ...

  9. mysql添加新的实例_MySQL中添加新用户权限的实例详解

    有2个不同的方法增加用户:通过使用GRANT语句或通过直接操作MySQL授权表.比较好的方法是使用GRANT语句,因为他们是更简明并且好像错误少些. 下面的例子显示出如何使用MySQL客户安装新用户. ...

  10. mysql通过集合查询_MySQL使用集合函数进行查询操作实例详解

    本文实例讲述了MySQL使用集合函数进行查询操作.分享给大家供大家参考,具体如下: COUNT函数 SELECT COUNT(*) AS cust_num from customers; SELECT ...

最新文章

  1. 文件批量重命名的技术,你值得拥有
  2. NeurlPS 2021论文预讲会议题全公开,4大主题和25场报告等你来
  3. jquery中邮箱地址 URL网站地址正则验证实例代码
  4. ckeditor java 上传_java使用CKEditor实现图片上传功能
  5. notepad自动对齐html代码,notepad如何存储为html格式化
  6. NUC1014 排版题.输出排列成菱形的字母【打印图案】
  7. 视频语音识别_视频语音识别体验_视频语音识别试用 - 云+社区 - 腾讯云
  8. 6大常见排序算法 python实现
  9. 架构之美第九章-架构与设计
  10. Java三大特性的第一个分水岭——封装性
  11. [秩相关] Spearman秩相关系数计算及假设检验
  12. 数据分析--卡方分析与方差分析
  13. matlab画六面体,MATLAB绘制平行六面体
  14. cad lisp 螺栓_如何用cad画螺丝
  15. Photoshop设计精讲笔记
  16. iview学习帮助文档
  17. 以太网实习_实习 | 2018年春季实习面试问题整理
  18. 码云+docker+jenkins持续集成
  19. JESD22-A120C,2022年最新版发布。用于集成电路的有机材料的水汽扩散率以及水溶解度试验方法
  20. c盘文件移动到d盘(win7c盘文件移动到d盘)

热门文章

  1. 数字货币HD钱包 BIP32、BIP44、BIP39 简介
  2. CentOS添加常用yum源
  3. Native wifi API使用
  4. C宏定义中## 和# 的含义
  5. VS 的makefile工程
  6. windows与linux下的\r\n
  7. virtio后端驱动详解
  8. mysql5.5数据库操作_命令行下mysql数据库基本操作
  9. 变量的定义 声明和初始化和static
  10. 获取当前横竖屏_Chrome扩展程序一键生成网页骨架屏