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 相关文章推荐
echo(),print(),print_r()之间的区别?
Nov 19 PHP
PHP 中文乱码解决办法总结分析
Jul 30 PHP
php中使用DOM类读取XML文件的实现代码
Dec 14 PHP
thinkphp验证码显示不出来的解决方法
Mar 29 PHP
PHP中使用file_get_contents post数据代码例子
Feb 13 PHP
Linux系统下php获得系统分区信息的方法
Mar 30 PHP
在Mac OS上搭建PHP的Yii框架及相关测试环境
Feb 14 PHP
php无法连接mysql数据库的正确解决方法
Jul 01 PHP
自制PHP框架之设计模式
May 07 PHP
PHP实现蛇形矩阵,回环矩阵及数字螺旋矩阵的方法分析
May 29 PHP
PHP实现用户异地登录提醒功能的方法【基于thinkPHP框架】
Mar 15 PHP
PHP设计模式(一)工厂模式Factory实例详解【创建型】
May 02 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
用PHP调用Oracle存储过程
2006/10/09 PHP
PHP获取youku视频真实flv文件地址的方法
2014/12/23 PHP
PHP生成可点击刷新的验证码简单示例
2016/05/13 PHP
php 算法之实现相对路径的实例
2017/10/17 PHP
PHP的mysqli_ssl_set()函数讲解
2019/01/23 PHP
PHP实现的微信公众号扫码模拟登录功能示例
2019/05/30 PHP
一份老外写的XMLHttpRequest代码多浏览器支持兼容性
2007/01/11 Javascript
了不起的node.js读书笔记之node.js中的特性
2014/12/22 Javascript
最简单的JavaScript验证整数、小数、实数、有效位小数正则表达式
2015/04/17 Javascript
Popup弹出框添加数据实现方法
2017/10/27 Javascript
基于vue中解决v-for使用报红并出现警告的问题
2018/03/03 Javascript
vue element-ui 绑定@keyup事件无效的解决方法
2018/03/09 Javascript
深入浅析Node环境和浏览器的区别
2018/08/14 Javascript
vuejs实现ready函数加载完之后执行某个函数的方法
2018/08/31 Javascript
解决axios post 后端无法接收数据的问题
2019/10/29 Javascript
Vue+Vant 图片上传加显示的案例
2020/11/03 Javascript
[54:33]2018DOTA2亚洲邀请赛小组赛 A组加赛 Liquid vs Optic
2018/04/03 DOTA
python中文编码问题小结
2014/09/28 Python
python创建临时文件夹的方法
2015/07/06 Python
Python OpenCV获取视频的方法
2018/02/28 Python
OpenCV+Python--RGB转HSI的实现
2019/11/27 Python
python scrapy重复执行实现代码详解
2019/12/28 Python
Python for循环搭配else常见问题解决
2020/02/11 Python
如何查看Django ORM执行的SQL语句的实现
2020/04/20 Python
使用HTML5进行SVG矢量图形绘制的入门教程
2016/02/19 HTML / CSS
Otticanet澳大利亚:最顶尖的世界名牌眼镜, 能得到打折季的价格
2018/08/23 全球购物
澳大利亚一站式数码相机商店:CameraPro
2020/03/09 全球购物
同步和异步有何异同,在什么情况下分别使用他们?举例说明
2014/02/27 面试题
统计系教授推荐信
2014/02/28 职场文书
《散步》教学反思
2014/03/02 职场文书
师德师风承诺书
2014/05/23 职场文书
我与祖国共奋进演讲稿
2014/09/13 职场文书
大学生实习证明范文(5篇)
2014/09/18 职场文书
2015年幼儿教师个人工作总结
2015/05/20 职场文书
送给火锅店的创意营销方案!
2019/07/08 职场文书
Win11怎么添加用户?Win11添加用户账户的方法
2022/07/15 数码科技