php+mysql实现的无限分类方法类定义与使用示例


Posted in PHP onMay 27, 2020

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

创建数据库以及表

CREATE DATABASE `sortclass`DEFAULT CHARSET utf8;
 CREATE TABLE IF NOT EXISTS `class` (
 `cid` mediumint(8) unsigned NOT NULL auto_increment,
 `pid` mediumint(8) unsigned NOT NULL,
 `cname` varchar(50) NOT NULL,
 PRIMARY KEY (`cid`),
 KEY `pid` (`pid`)
 ) ENGINE=MyISAM DEFAULT CHARSET=utf8;
header("Content-type: text/html; charset=utf-8");
//连接数据库
$link = mysql_connect('localhost','root','eric') or die(mysql_error());
mysql_select_db('sortclass',$link);
//无限分类类库
class SortClass{
 var $data = array();
 var $child = array(-1=>array());
 var $layer = array(-1=>-1);
 var $parent = array();
 var $link;
 var $table;
 function SortClass($link, $table){
  $this->setNode(0, -1, '顶极节点');
  $this->link = $link;
  $this->table = $table;
  $node = array();
  $results = mysql_query('select * from '.$this->table.'',$this->link);
  while($node = mysql_fetch_assoc($results)){
   $this->setNode($node['cid'],$node['pid'],$node['cname']);
  }
 }
 function setNode ($id, $parent, $value){
  $parent = $parent?$parent:0;
  $this->data[$id] = $value;
  $this->child[$id] = array();
  $this->child[$parent][] = $id;
  $this->parent[$id] = $parent;
  $this->layer[$id] = !isset($this->layer[$parent])? 0 : $this->layer[$parent] + 1;
 }
 function getList (&$tree, $root= 0){
  foreach ($this->child[$root] as $key=>$id){
   $tree[] = $id;
   if ($this->child[$id]) $this->getList($tree, $id);
  }
 }
 function getValue ($id){return $this->data[$id];}
 function getLayer ($id, $space = false){
  return $space?str_repeat($space, $this->layer[$id]):$this->layer[$id];
 }
 function getParent ($id){return $this->parent[$id];}
 function getParents ($id){
  while ($this->parent[$id] != -1){
   $id = $parent[$this->layer[$id]] = $this->parent[$id];
  }
  ksort($parent);
  reset($parent);
  return $parent;
 }
 function getChild ($id){return $this->child[$id];}
 function getChilds ($id = 0){
  $child = array($id);
  $this->getList($child, $id);
  return $child;
 }
 function addNode($name,$pid){
  mysql_query("insert into $this->table (`pid`,`cname`) values ('$pid','$name')",$this->link);
 }
 function modNode($cid, $newName){
  mysql_query("update $this->table set `cname`='$newName' where `cid` = $cid",$this->link);
 }
 function delNode($cid){
  $allChilds = $this->getChilds($cid);
  $sql ='';
  if(empty($allChilds)){
   $sql = "delete from $this->table where `cid` = $cid";
  }else{
   $sql = 'delete from '.$this->table.' where `cid` in ('.implode(',',$allChilds).','.$cid.')';
  }
  mysql_query($sql,$this->link);
 }
 function moveNode($cid, $topid){
  mysql_query("update $this->table set `pid`=$topid where `cid` = $cid", $this->link);
 }
}
//函数
function back(){
 echo '<script language="JavaScript">window.location.href="test.php?" rel="external nofollow" +new Date().getTime();</script>';
 exit;
}
//声成select
function makeSelect($array,$formName){
 global $tree;
 $select = '<select name="'.$formName.'">';
 foreach ($array as $id){
  $select.='<option value="'.$id.'">'.$tree->getLayer($id, '|-').$tree->getValue($id)."</option>";
 }
 return $select.'</select>';
}
$tree = new SortClass($link,'`class`');
$op = !empty($_POST['op']) ? $_POST['op'] : $_GET['op'];
if(!empty($op)){

 if($op=='add'){
  $tree->addNode($_POST['cname'],$_POST['pid']);
  back();
 }

 if($op=='mod'){
  $tree->modNode($_POST['cid'],$_POST['cname']);
  back();
 }

 if($op=='del'){
  $tree->delNode($_GET['cid']);
  back();
 }

 if($op=='move'){
  $tree->moveNode($_POST['who'],$_POST['to']);
  back();
 }
}
$category = $tree->getChilds();
?>
 <style type="text/css">
  body{font-size:12px;}
  ul{list-style:none;}
  a{cursor:pointer;}
 </style>
 <script language="javascript">
  function $(e){return document.getElementById(e);}
  function mod(cid){
   $('cid').value=cid;
   $('op').value='mod';
   $('name').style.border='1px solid red';
  }
 </script>
 <form action="test.php" method="post">
  名称:<input type="text" id="name" name="cname" /> 添加到:<?=makeSelect($category,'pid')?><br />
  <input type="hidden" id="op" name="op" value="add" />
  <input type="hidden" id="cid" name="cid" />
  <input type="submit" value="Submit" />
 </form>
 <h3>移动分类</h3>
 <form action="test.php" method="post">
  <?=makeSelect($category,'who')?>移动到:<?=makeSelect($category,'to')?>
  <input type="hidden" id="op" name="op" value="move" />
  <input type="submit" value="Submit" />
 </form>
 <ul>
<?php
foreach ($category as $id){
 echo '<li>'.$tree->getLayer($id, '|- ').$tree->getValue($id).' <a href="test.php?op=del&cid='.$id.'" rel="external nofollow" >Del</a> <a onclick="mod('.$id.')">Edit</a> </li>';
}
?>
</ul>

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

PHP 相关文章推荐
php下intval()和(int)转换使用与区别
Jul 18 PHP
ajax 的post方法实例(带循环)
Jul 04 PHP
浅析HTTP消息头网页缓存控制以及header常用指令介绍
Jun 28 PHP
PHP按行读取、处理较大CSV文件的代码实例
Apr 09 PHP
php检查字符串中是否有外链的方法
Jul 29 PHP
php实现微信发红包
Dec 05 PHP
PHP安全下载文件的方法
Apr 07 PHP
用PHP写的一个冒泡排序法的函数简单实例
May 26 PHP
PHP二维数组实现去除重复项的方法【保留各个键值】
Dec 21 PHP
PHP生成二维码与识别二维码的方法详解【附源码下载】
Mar 07 PHP
php实现的简单多进程服务器类完整示例
Feb 01 PHP
php中Swoole的热更新实现代码实例
Mar 04 PHP
php与阿里云短信接口接入操作案例分析
May 27 #PHP
PHP开发API接口签名生成及验证操作示例
May 27 #PHP
php+websocket 实现的聊天室功能详解
May 27 #PHP
php+js实现的拖动滑块验证码验证表单操作示例【附源码下载】
May 27 #PHP
PHP code 验证码生成类定义和简单使用示例
May 27 #PHP
PHP 计算至少是其他数字两倍的最大数的实现代码
May 26 #PHP
tp5.1 框架数据库-数据集操作实例分析
May 26 #PHP
You might like
DC这些乐高系列动画电影你看过几部?
2020/04/09 欧美动漫
php 中include()与require()的对比
2006/10/09 PHP
php采集文章中的图片获取替换到本地(实现代码)
2013/07/08 PHP
php防注入及开发安全详细解析
2013/08/09 PHP
php 三大特点:封装,继承,多态
2017/02/19 PHP
CodeIgniter框架常见用法工作总结
2017/03/16 PHP
PHP safe_mode开启对于PHP系统函数有什么影响
2020/11/10 PHP
contains和compareDocumentPosition 方法来确定是否HTML节点间的关系
2011/09/13 Javascript
JavaScript高级程序设计 读书笔记之八 Function类及闭包
2012/02/27 Javascript
JS特殊函数(Function()构造函数、函数直接量)区别介绍
2013/05/19 Javascript
JS实现具备延时功能的滑动门菜单效果
2015/09/17 Javascript
js实现精确到毫秒的倒计时效果
2016/08/05 Javascript
纯js实现手风琴效果代码
2020/04/17 Javascript
jquery 动态增加删除行的简单实例(推荐)
2016/10/12 Javascript
微信小程序 教程之wxapp 视图容器 view
2016/10/19 Javascript
jQuery validate 验证radio实例
2017/03/01 Javascript
webstorm添加vue.js支持的方法教程
2017/07/05 Javascript
Vue二次封装axios为插件使用详解
2018/05/21 Javascript
python将人民币转换大写的脚本代码
2013/02/10 Python
浅析Python中return和finally共同挖的坑
2017/08/18 Python
Python3使用xml.dom.minidom和xml.etree模块儿解析xml文件封装函数的方法
2019/09/23 Python
Python自动采集微信联系人的实现示例
2020/02/28 Python
python数据类型可变不可变知识点总结
2020/03/06 Python
Django-Scrapy生成后端json接口的方法示例
2020/10/06 Python
Canvas globalCompositeOperation
2018/12/18 HTML / CSS
西班牙最大的婴儿用品网上商店:Bebitus
2019/05/30 全球购物
Internet体系结构
2014/12/21 面试题
C#笔试题集合
2013/06/21 面试题
商场经理竞聘演讲稿
2014/01/01 职场文书
幼儿园教师自我鉴定
2014/03/20 职场文书
小学生关于梦想的演讲稿
2014/08/22 职场文书
法人代表授权委托书范文
2014/09/10 职场文书
机械专业毕业生自我鉴定2014
2014/10/04 职场文书
共产党员批评与自我批评
2014/10/15 职场文书
导游词之广州陈家祠
2019/10/21 职场文书
导游词之安徽醉翁亭
2020/01/10 职场文书