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 相关文章推荐
如何限制访问者的ip(PHPBB的代码)
Oct 09 PHP
很好用的PHP数据库类
May 27 PHP
PHP 内存缓存加速功能memcached安装与用法
Sep 03 PHP
php面向对象全攻略 (十七) 自动加载类
Sep 30 PHP
PHP 关于访问控制的和运算符优先级介绍
Jul 08 PHP
php中require和require_once的区别说明
Feb 27 PHP
PHP语法自动检查的Vim插件
Aug 11 PHP
php图片水印添加、压缩、剪切的封装类实现
Apr 18 PHP
YII Framework框架教程之缓存用法详解
Mar 14 PHP
py文件转exe时包含paramiko模块出错解决方法
Aug 12 PHP
PHP的curl函数的用法总结
Feb 14 PHP
PHP实现随机发扑克牌
Apr 22 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 变量的定义方法
2010/01/26 PHP
php二维数组排序与默认自然排序的方法介绍
2013/04/27 PHP
php判断字符串在另一个字符串位置的方法
2014/02/27 PHP
PHP生成压缩文件实例
2015/02/07 PHP
php上传图片并压缩的实现方法
2015/12/22 PHP
js动态给table添加/删除tr的方法
2013/08/02 Javascript
jquery 快速回到页首的方法
2013/12/05 Javascript
javascript打开word文档的方法
2014/04/16 Javascript
使用原生js封装webapp滑动效果(惯性滑动、滑动回弹)
2014/05/06 Javascript
tuzhu_req.js 实现仿百度图片首页效果
2015/08/11 Javascript
JavaScript的代码编写格式规范指南
2015/12/07 Javascript
node.js cookie-parser之parser.js
2016/06/06 Javascript
jQuery拖拽通过八个点改变div大小
2020/11/29 Javascript
JS使用正则实现去掉字符串左右空格的方法
2016/12/27 Javascript
使用BootStrap实现表格隔行变色及hover变色并在需要时出现滚动条
2017/01/04 Javascript
Vue.js学习之过滤器详解
2017/01/22 Javascript
详解如何使用PM2将Node.js的集群变得更加容易
2017/11/15 Javascript
jQuery实现获取当前鼠标位置并输出功能示例
2019/01/05 jQuery
python实现折半查找和归并排序算法
2017/04/14 Python
浅谈python中的__init__、__new__和__call__方法
2017/07/18 Python
Python编程argparse入门浅析
2018/02/07 Python
python抓取文件夹的所有文件
2018/02/27 Python
详解Python最长公共子串和最长公共子序列的实现
2018/07/07 Python
Pandas Shift函数的基础入门学习笔记
2018/11/16 Python
Python简单I/O操作示例
2019/03/18 Python
python设置环境变量的作用和实例
2019/07/09 Python
Python 从subprocess运行的子进程中实时获取输出的例子
2019/08/14 Python
Python3和PyCharm安装与环境配置【图文教程】
2020/02/14 Python
tensorflow使用CNN分析mnist手写体数字数据集
2020/06/17 Python
Python爬虫中Selenium实现文件上传
2020/12/04 Python
Java面试题汇总
2015/12/06 面试题
2014年小班元旦活动方案
2014/02/16 职场文书
夫妻房产协议书的格式
2014/10/11 职场文书
银行反洗钱宣传活动总结
2015/05/08 职场文书
Python使用sql语句对mysql数据库多条件模糊查询的思路详解
2021/04/12 Python
如何正确理解python装饰器
2021/06/15 Python