一句SQL语句搞定无限级分类树列表

2009年11月4日 | 标签:

以前总结的方法,这次教学中给同学们提到了,就实现了出来。

  1. /*
  2. * 无限极
  3. * 特色:单sql语句,配合php算法,即可用一句sql查询语句列出无限极目录树
  4. * 数据结构
  5.     CREATE TABLE `cat` (
  6.         `cid` INT(5) UNSIGNED NOT NULL AUTO_INCREMENT,
  7.         `cname` VARCHAR(50) NOT NULL,
  8.         `lev` INT(5) UNSIGNED NOT NULL COMMENT '分类层数',
  9.         `pid` INT(5) UNSIGNED NOT NULL COMMENT '上级cid',
  10.         PRIMARY KEY (`cid`)
  11.     )
  12. */
  13. error_reporting(7);
  14. mysql_connect("localhost", "root", "");
  15. mysql_select_db("test");
  16. mysql_query("set names utf-8");
  17.  
  18. $act = $_GET['act'];
  19. if($act == "insert") {
  20.     $cname = trim($_POST['cname']);
  21.     $pid = intval($_POST['cid']);
  22.  
  23.     $query = "select * from cat where cid='$pid'";
  24.     $res = mysql_query($query);
  25.     $row = mysql_fetch_assoc($res);
  26.     $parent_lev = $row['lev'];
  27.  
  28.     $query = "insert into cat set cname='$cname',lev='".($parent_lev+1)."',pid='$pid'";
  29.     mysql_query($query);
  30.  
  31.     echo("<a href='".$_SERVER['PHP_SELF']."'>增加新分类成功");
  32.     die;
  33. }else{
  34.  
  35.     $sql = "SELECT * FROM cat ORDER BY pid ASC, cid ASC";//order by pid 是后面分析的基础(勿改动)
  36.     $res = mysql_query($sql);
  37.     $arr = array();
  38.  
  39.     $lastPid = "";
  40.     while($row = mysql_fetch_assoc($res)) {
  41.         if($lastPid == "" || $row['pid'] == $lastPid) {
  42.             ;
  43.         }else{
  44.             unset($lastPid);
  45.         }
  46.         $lastPid = $row['pid'];
  47.         $arr[$lastPid][] = $row;
  48.     }
  49.  
  50.  
  51.     $okArr = array();
  52.     foreach($arr[0] as $pid=>$row) {
  53.         okArr($row);    //迭代数组的每个值进行层级分析,并保存到okArr数组中
  54.     }
  55.  
  56. ?>
  57.     <form method="post" action="<?php echo($_SERVER['PHP_SELF']);?>?act=insert">
  58.     增加分类:<select name="cid">
  59.         <option value="">--------</option>
  60.         < ?php
  61.         foreach($okArr as $key=>$row) {
  62.         ?>
  63.         <option value="<?php echo($row['cid']);?>">
  64.         < ?php for($i=1;$i<$row['lev'];$i++) {echo("&nbsp;&nbsp;");}?>
  65.         < ?php echo($row['cname']);?></option>
  66.         < ?php
  67.         }
  68.         ?>
  69.     </select><br />
  70.     分类名称:<input type="text" name="cname"/><br />
  71.     <input type="submit" value="增加"/>
  72.     </form>
  73. < ?php
  74. }
  75.  
  76. //迭代调用的数组分析方法
  77. function okArr($a) {
  78.     global $arr, $index, $okArr;
  79.    
  80.     if(!empty($a['cname'])) {
  81.         //当前数组a是一个单一的数组信息记录
  82.    
  83.         if(!empty($okArr[$a['pid'].'>'.$a['cid']])) {
  84.             //已有该数组的ok信息了,通过okArr数组的键值判断
  85.             //okArr的键值设计原则:pid>cid
  86.             return;
  87.         }
  88.  
  89.         //保存数组信息到okArr数组中
  90.         $okArr[$a['pid'].'>'.$a['cid']] = $a;
  91.  
  92.         if(!empty($arr[$a['cid']])) {
  93.             //如果该层分类下还有子分类,则迭代
  94.             okArr($arr[$a['cid']]);
  95.         }
  96.     }else{
  97.         //当前数组a是一个pid相同的多个同级分类数组
  98.         foreach($a as $pid=>$row) {
  99.             //迭代每个同级分类的元素
  100.             okArr($row);
  101.         }
  102.     }
  103. }
  104. </a>
  1. 2009年12月18日19:05

    看不懂。。

    跟俺讲的不一样啊。。。

  2. 2009年12月20日15:50

    这是单SQL语句实现的,上课时候实现的是迭代方法。不是一个方法。
    这个单SQL语句的方法相对来说比较难理解。

您必须在 登录 后才能发布评论.