php+mysql实现无限级分类

项目思路分析:一个PHP项目要用到分类,但不确定分几级,所以就想做成无限级分类。
一开始想是按以前一样,数据库建4个值,如下:
id: 自增   |   pid: 父类ID   |  xid: 排序ID   |  classname: 分类名称
后来想到这种在读取数据时和修改时比较不方便,而且在产品读取时尤其不便,于时改成了以下的方案:
在Mysql的表中新增了一个字段,现数据库如下:
表名 w_faqclass:   id: 自增   |   pid: 父类ID   |  xid: 排序ID   |  classname: 分类名称  |  rank:  等级
定义:
一级分类,pid 为 0 ,rank 为"/"
二级分类,pid 为 一级分类的id,rank 为"/一级分类的id/"
三级分类,pid 为 二级分类的id,rank 为"/一级分类的id/二级分类的id/"
依此类推...
1. 基础函数    

/*
利于递归返回已经进行了排序的无限级分类的数组
不想用递归的话也可以用 like 来获取后再进行排序,我比较懒,就不写那种获取方式了,其实用 like 更好,推荐用那种方式
$datatable    : 数据表名
$startid    : 开始父类ID
$wheretColumns  :父类列名
$xColumns    : 排序列名
$xtype      : 排序方式
$returnArr    : 返回数组
*/
function ReadClass($datatable,$startid,$xtype,$returnArr){
  $db    =  $datatable;
  $sid  =  $startid;
  $xtype  =  $xtype;
  $lu    =  $returnArr;

  $sql  =  "select * from `".$db."` where `pid`='".$sid."' order by xid ".$xtype.";";
  $cresult=  mysql_query($sql);
  if(mysql_num_rows($cresult)>0){
    while($rs = mysql_fetch_array($cresult)){
      $lunum = count($lu);
      $lu[$lunum]['id']    =  $rs['id'];
      $lu[$lunum]['pid']    =  $rs['pid'];
      $lu[$lunum]['rank']    =  $rs['rank'];
      $lu[$lunum]['classname']=  $rs['classname'];
      $lu[$lunum]['xid']    =  $rs['xid'];

      $lu            =  ReadClass($db,$rs['id'],$xtype,$lu);
    }
  }
  return $lu;
}
/*
查询某表中的某个值,只会返回一个值
$datatable    : 数据表名
$wherevalue    : 条件值
$selectColumns  : 查询列名
$whereColumns  : 条件列
*/
function SelectValue($datatable,$wherevalue,$selectColumns,$whereColumns){
  $sql  =  "select `".$selectColumns."` from `".$datatable."` where `".$whereColumns."`='".$wherevalue."';";
  $result  =  mysql_query($sql);
  while($rs = mysql_fetch_array($result)){
    return $rs[$selectColumns];
  }
}

2. 增加分类 (直接做到了select中用于选择 )    

<?php
  $classArr = ReadClass('w_faqclass','0','asc',array());
  $canum = count($classArr);

  echo "<select name='pid'>";
  echo "<option value='0'>主分类</option>";
  for($i=0; $i<$canum; $i++){
    $rankArr = split("/",$classArr[$i]['rank']);
    $ranknum = count($rankArr);
    $t = "";
    for($j=1; $j<$ranknum; $j++){ //用于格式化显示子类
      $t .= "├┄┄";
    }
    echo "<option value='".$classArr[$i]['id']."'>".$t.$classArr[$i]['classname']."</option>";
  }
  echo "</select>"
?> 

//保存时的操作,需要判断是否为主分类,当为主类时, rank 值设为 /
//查询父类的 rank 值,用父类的 rank 加上 父类的 id 值
if($pid != 0){
  $pidrank = SelectValue('w_faqclass',$pid,'rank','id');
  $rank = $pidrank.$pid."/";
}else{
  $rank = "/";
}

3. 修改分类    

<?php
  /*
  注意,因为是修改,在此页面加载时已将当前分类的所有值读出来了,对应是:$pid,$rank
  */
  $classArr = ReadClass('w_faqclass','0','asc',array());
  $canum = count($classArr);
  echo "<select name='pid'>";
  echo "<option value='0'>主分类</option>";

  for($i=0; $i<$canum; $i++){
    // 因为是修改,所以当前分类不能选择自身或自身以下的分类,多加个 rank 值的优势啊,哈哈,以前做单pid值的时候这里还得用次递归查询
    while($ids == $classArr[$i]['id'] || strstr($classArr[$i]['rank'],$rank.$ids."/")){
      $i++;
    }

    $rankArr = split("/",$classArr[$i]['rank']);
    $ranknum = count($rankArr);
    $t = "";
    for($j=1; $j<$ranknum; $j++){
      $t .= "├┄┄";
    }
    if($pid == $classArr[$i]['id']){
      $selected = "selected";
    }else{
      $selected = "";
    }
    echo "<option value='".$classArr[$i]['id']."' ".$selected.">".$t.$classArr[$i]['classname']."</option>";
  }
  echo "</select>"
?>

// 保存时的操作
// 要做到改动时该分类的所有子分类rank值都需要变动,选取得原来子分类通用到的 rank 值,也就是该分类的 rank值加上它的ID值
// 利于 mysql 的REPLACE语句进行替换
if($pid != 0){
  $pidrank = SelectValue('w_faqclass',$pid,'rank','id');
  $rank = $pidrank.$pid."/";
}else{
  $rank = "/";
}
$orank = SelectValue('w_faqclass',$ids,'rank','id').$ids."/";
$nrank = $rank.$ids."/";

mysql_query("UPDATE `w_faqclass` SET rank = REPLACE(rank,'".$orank."','".$nrank."');");
mysql_query("UPDATE `w_faqclass` SET `classname`='".$classname."',`xid`='".$xid."',`pid`='".$pid."',`rank`='".$rank."' where `id`='".$ids."';");

4. 删除和查询就简单了,这个就不赘述了,提到一点,记得在删除前确认下该类下面是否存在子类就可以了。

$zid = SelectValue('w_faqclass',$ids,'id','pid');

if($zid>0){
  ...
}

以上就是php+mysql实现无限极分类的方法,希望对大家的学习有所帮助。

(0)

相关推荐

  • 实现PHP+Mysql无限分类的方法汇总

    无限分类是个老话题了,来看看PHP结合Mysql如何实现. 第一种方法 这种方法是很常见.很传统的一种,先看表结构 表:category id int 主键,自增 name varchar 分类名称 pid int 父类id,默认0 顶级分类的 pid 默认就是0了.当我们想取出某个分类的子分类树的时候,基本思路就是递归,当然,出于效率问题不建议每次递归都查询数据库,通常的做法是先讲所有分类取出来,保存到PHP数组里,再进行处理,最后还可以将结果缓存起来以提高下次请求的效率. 先来构建一个原始数

  • php+mysql实现无限分类实例详解

    本文实例讲述了php+mysql实现无限分类的方法.分享给大家供大家参考.具体分析如下: 1.数据库通过设置父类ID来进行唯一索引,然后使用函数的递归调用实现无限分类: 2.数据库设计通过特定格式进行排列,然后使用mysql查询关键函数:concat,程序实现比较简单,首先我们假设有这样的一个三级分类,新闻→PHP新闻→PHP6.0出来了. 如果我们要查找"PHP6.0出来了"这条新闻,我们先点击新闻,然后再点击PHP新闻,就可以查出来了,也就是说我们可以通过祖父类一级一级地往下找,反

  • php+mysql查询实现无限下级分类树输出示例

    本文实例讲述了php+mysql查询实现无限下级分类树输出.分享给大家供大家参考,具体如下: 这里介绍的php结合mysql查询无限下级树输出,其实就是无限分类.给各位整理了几个php无限分类的例子. 树输出: function get_array($user_id,$top=0){ global $mysql,$_G; $sql = "select user_id as name from `{spreads_users}` where p1.spreads_userid='{$user_id

  • php+mysql实现无限级分类 | 树型显示分类关系

    无限级分类,主要是通过储存上级分类的id以及分类路径来实现.由于数据的结构简单,所以要将分类的关系由树状显示,我只能想到用递归的方式给于实现. 无限级分类,主要是通过储存上级分类的id以及分类路径来实现.由于数据的结构简单,所以要将分类的关系由树状显示,我只能想到用递归的方式给于实现,下面是分类数据表结构和自己写的一个树状显示函数,有什么不妥的地方希望大家能指出.  表结构:id字段为分类标识,name字段为分类名,father_id字段为所属父分类的id,path字段为分类路径(储存该分类祖先

  • php+mysql数据库实现无限分类的方法

    本文实例讲述了php+mysql数据库实现无限分类的方法.分享给大家供大家参考.具体分析如下: 这款php无限分类代码比较完整理包括了数据库是mysql的,有增加.删除.编辑.移动的功能,同时还提供数据库sql表结构.代码如下: 复制代码 代码如下: //连接数据库 $link = mysql_connect('localhost','root','') or die(mysql_error()); mysql_select_db('class',$link)or die(mysql_error

  • jQuery+PHP+MySQL实现无限级联下拉框效果

    本文简单实现jQuery无限级联效果,分享给大家供大家参考,具体内容如下  效果图: 图1 仅下拉框 图2 层级提示+下拉框 图3 存储数据点击响应 主要包含3个文件:index.html(主页),wuxianjilian.php(数据处理),wuxianjilian.sql(MySQL数据文件) 1. index.html <html> <head> <title>无限级联</title> <meta http-equiv="Content

  • php+mysql不用递归实现的无限级分类实例(非递归)

    要实现无限级分类,递归一般是第一个也是最容易想到的,但是递归一般被认为占用资源的方法,所以很多系统是不考虑使用递归的 本文还是通过数据库的设计,用一句sql语句实现 数据库字段大概如下: 复制代码 代码如下: id 编号 fid 父分类编号 class_name 分类名 path 分类路径,以 id 为节点,组成类似 ,1,2,3,4, 这样的字符串 可以假设有如下的数据: 复制代码 代码如下: id fid class_name path 1  0       分类1 ,       1, 2

  • PHP+Mysql树型结构(无限分类)数据库设计的2种方式实例

    我们经常需要在关系型数据库中保存一些树状结构数据,比如分类.菜单.论坛帖子树状回复等.常用的方法有两种: 1. 领接表的方式: 2. 预排序遍历树方式: 假设树状结构如下图: 领接表方式 主要依赖于一个 parent 字段,用于指向上级节点,将相邻的上下级节点连接起来,id 为自动递增自动,parent_id 为上级节点的 id.一目了然,"Java"是"Language"的子节点. 我们要显示树,PHP 代码也可以很直观,代码如下: 复制代码 代码如下: <

  • PHP递归写入MySQL实现无限级分类数据操作示例

    本文实例讲述了PHP递归写入MySQL实现无限级分类数据操作.分享给大家供大家参考,具体如下: PHP递归写入MySQL无限级分类数据,表结构: CREATE TABLE `kepler_goods_category` ( `id` int unsigned NOT NULL PRIMARY KEY AUTO_INCREMENT, `parentid` int unsigned NOT NULL default 0 comment '父级分类ID', `name` varchar(255) NO

  • php+mysql实现无限级分类

    项目思路分析:一个PHP项目要用到分类,但不确定分几级,所以就想做成无限级分类. 一开始想是按以前一样,数据库建4个值,如下: id: 自增   |   pid: 父类ID   |  xid: 排序ID   |  classname: 分类名称 后来想到这种在读取数据时和修改时比较不方便,而且在产品读取时尤其不便,于时改成了以下的方案: 在Mysql的表中新增了一个字段,现数据库如下: 表名 w_faqclass:   id: 自增   |   pid: 父类ID   |  xid: 排序ID 

  • PHPTree——php快速生成无限级分类

    它就是PHPTree. git地址:https://git.oschina.net/jiusem/PHPTree.git 或从我们下载 http://www.jb51.net/codes/606002.html 最简单的例子: <?php require('PHPTree.class.php'); //原始数据, 从数据库读出 $data = array( array( 'id'=>1, 'name'=>'book', 'parent_id'=>0 ), array( 'id'=&

  • mysql 无限级分类实现思路

    第一种方案: 使用递归算法,也是使用频率最多的,大部分开源程序也是这么处理,不过一般都只用到四级分类.这种算法的数据库结构设计最为简单.category表中一个字段id,一个字段fid(父id).这样可以根据WHERE id = fid来判断上一级内容,运用递归至最顶层. 分析:通过这种数据库设计出的无限级,可以说读取的时候相当费劲,所以大部分的程序最多3-4级分类,这就足以满足需求,从而一次性读出所有的数据,再对得到数组或者对象进行递归.本身负荷还是没太大问题.但是如果分类到更多级,那是不可取

  • php无限级分类实现方法分析

    本文实例讲述了php无限级分类实现方法.分享给大家供大家参考,具体如下: 1. 递归 public function getInfo(){ $data=$this->select(); $arr=$this->noLimit($data,$f_id=0,$level=0); return $arr; } //无限极分类 public function noLimit($data,$f_id=0,$level=0){ static $lists=array(); foreach($data as

  • php实现无限级分类(递归方法)

    相信很多学php的很多小伙伴都会尝试做一个网上商城作为提升自己技术的一种途径.各种对商品分类,商品名之类的操作应该是得心应手,那么就可以尝试下无限级分类列表的制作了. 到网上一搜php无限极分类,很多,但好多都是一个,并且,写的很乱,代码很多,让我们怎么学习嘛,那些都不靠谱,还是自己捣鼓捣鼓无限极分类了. 什么是无限级分类? 无限级分类是一种分类技巧,例如部门组织,文章分类,学科分类等常用到无限级分类,将其简单理解成分类就好了.其实我们仔细想一下,生活中的分类简直太多了,衣服可以分为男装和女装,

  • PHP实现递归无限级分类

    在一些复杂的系统中,要求对信息栏目进行无限级的分类,以增强系统的灵活性.那么PHP是如何实现无限级分类的呢?我们在本文中使用递归算法并结合mysql数据表实现无限级分类. 递归,简单的说就是一段程序代码的重复调用,当把代码写到一个自定义函数中,将参数等变量保存,函数中重复调用函数,直到达到某个条件才跳出,返回相应的数据. Mysql 首先我们准备一张数据表class,记录商品分类信息.表中有三个字段,id:分类编号,主键自增长:title:分类名称:pid:所属上级分类id. class表结构:

  • laravel 框架实现无限级分类的方法示例

    本文实例讲述了laravel 框架实现无限级分类的方法.分享给大家供大家参考,具体如下: 模型中的代码 namespace App\models\wxj; use Illuminate\Support\Facades\DB; use Session; class Wxjlx { public function r(){ //输出数据库的所有内容 $sql=DB::table('wxjlx')->get(); //调用fl方法 $result=self::fl($sql,$pid=0); retu

随机推荐