PHP实现的无限分类类库定义与用法示例【基于thinkPHP】


Posted in PHP onAugust 06, 2018

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

/*
功能:基于TP2.0的无限分类。
用法:
第一种用法,不采用数据库,可以不需要TP,例子如下
<?php
require('Category.class.php');//导入Category.class.php类
//测试数据
$data[]=array('cat_id'=>1,'pid'=>0,'name'=>'中国');
$data[]=array('cat_id'=>2,'pid'=>0,'name'=>'美国');
$data[]=array('cat_id'=>3,'pid'=>0,'name'=>'韩国');
$data[]=array('cat_id'=>4,'pid'=>1,'name'=>'北京');
$data[]=array('cat_id'=>5,'pid'=>1,'name'=>'上海');
$data[]=array('cat_id'=>6,'pid'=>1,'name'=>'广西');
$data[]=array('cat_id'=>7,'pid'=>6,'name'=>'桂林');
$data[]=array('cat_id'=>8,'pid'=>6,'name'=>'南宁');
$data[]=array('cat_id'=>9,'pid'=>6,'name'=>'柳州');
$data[]=array('cat_id'=>10,'pid'=>2,'name'=>'纽约');
$data[]=array('cat_id'=>11,'pid'=>2,'name'=>'华盛顿');
$data[]=array('cat_id'=>12,'pid'=>3,'name'=>'首尔');
$cat=new Category('',array('cat_id','pid','name','cname'));
$s=$cat->getTree($data);//获取分类数据树结构
//$s=$cat->getTree($data,1);获取pid=1所有子类数据树结构
foreach($s as $vo)
{
echo $vo['cname'].'<br>';
}
第二种用法,采用数据库,基于TP,例子如下
数据表,前缀_articlec_cat,包含cat_id,pid,title三个字段
require('Category.class.php');//导入Category.class.php类
$cat=new Category('ArticleCat',array('cat_id','pid','title','fulltitle'));
$s=$cat->getList();//获取分类结构
$s=$cat->getList('',1);//获取pid=1的子分类结构
$s=$cat->getList($condition,1);//$condition为查询条件,获取pid=1的子分类结构
$s=$cat->getPath(3);//获取分类id=3的路径
$s=$cat->add($data);//添加分类,$data需要包含上级分类pid
$s=$cat->edit($data);//修改分类,$data需要包含分类ID
$s=$cat->del(10);//删除分类id=10的分类
详细用法:参考代码说明
/**
+------------------------------------------------------------------------------
* 分类管理
+------------------------------------------------------------------------------
*/
class Category
{
  //分类的数据表模型
  private $model;
  //原始的分类数据
  private $rawList = array();
  //格式化后的分类
  private $formatList = array();
  //错误信息
  private $error = "";
  //格式化的字符
  private $icon = array(' │', ' ├ ', ' └ ');
  //字段映射,分类id,上级分类pid,分类名称title,格式化后分类名称fulltitle
  private $field = array();
  /*
  功能:构造函数,对象初始化;
  属性:public;
  参数:$model,数组或对象,基于TP2.0的数据表模型名称,若不采用TP2.0,可传递空值。
  $field,字段映射,分类id,上级分类pid,分类名称title,格式化后分类名称fulltitle
  依次传递,例如在分类数据表中,分类id,字段名为CatID,上级分类pid,字段名称name,希望格式化分类后输出cname,
  则,传递参数为,$field('CatID','pid','name','cname');若为空,则采用默认值。
  返回:无
  备注:用到了TP的D函数
  */
  public function __construct($model = '', $field = array())
  {
    //判断参数类型
    if (is_string($model) && (!empty($model))) {
      if (!$this->model = D($model)) //注意这里的D函数需要TP支持
        $this->error = $model . "模型不存在!";
    }
    if (is_object($model)) {
      $this->model =& $model;
    }
    $this->field['id']    = $field['0'] ? $field['0'] : 'id';
    $this->field['pid']    = $field['1'] ? $field['1'] : 'pid';
    $this->field['title']   = $field['2'] ? $field['2'] : 'title';
    $this->field['fulltitle'] = $field['3'] ? $field['3'] : 'fulltitle';
  }
  /*
  功能:获取分类信息数据;
  属性:private;
  参数:查询条件$condition;
  返回:无;
  备注:需要TP支持
  */
  private function _findAllCat($condition, $orderby = NULL)
  {
    if (empty($orderby)) {
      $this->rawList = $this->model->where($condition)->findAll();
    } else {
      $this->rawList = $this->model->where($condition)->order($orderby)->findAll();
    }
  }
  /*
  功能:返回给定上级分类$pid的所有同一级子分类;
  属性:public;
  参数:上级分类$pid;
  返回:子分类,二维数组;
  备注:
  */
  public function getChild($pid)
  {
    $childs = array();
    foreach ($this->rawList as $Category) {
      if ($Category[$this->field['pid']] == $pid)
        $childs[] = $Category;
    }
    return $childs;
  }
  /*
  功能:无限分类核心部分,递归格式化分类前的字符;
  属性:private;
  参数:分类id,前导空格;
  返回:无;
  备注:
  */
  private function _searchList($CatID = 0, $space = "")
  {
    //下级分类的数组
    $childs = $this->getChild($CatID);
    //如果没下级分类,结束递归
    if (!($n = count($childs)))
      return;
    $cnt = 1;
    //循环所有的下级分类
    for ($i = 0; $i < $n; $i++) {
      $pre = "";
      $pad = "";
      if ($n == $cnt) {
        $pre = $this->icon[2];
      } else {
        $pre = $this->icon[1];
        $pad = $space ? $this->icon[0] : "";
      }
      $childs[$i][$this->field['fulltitle']] = ($space ? $space . $pre : "") . $childs[$i][$this->field['title']];
      $this->formatList[]          = $childs[$i];
      //递归下一级分类
      $this->_searchList($childs[$i][$this->field['id']], $space . $pad . " ");
      $cnt++;
    }
  }
  /*
  功能:不采用数据模型时,可以从外部传递数据,得到递归格式化分类;
  属性:public;
  参数:$condition,数字或字符串,需要符合TP查询条件规则,起始分类id,$CatID=0;
  $orderby 排序参数
  返回:递归格式化分类数组;
  备注:需要TP支持
  */
  public function getList($condition = NULL, $CatID = 0, $orderby = NULL)
  {
    unset($this->rawList);
    unset($this->formatList);
    $this->_findAllCat($condition, $orderby, $orderby);
    $this->_searchList($CatID);
    return $this->formatList;
  }
  /*
  功能:不采用数据模型时,可以从外部传递数据,得到递归格式化分类;
  属性:public;
  参数:$data,二维数组,起始分类id,默认$CatID=0;
  返回:递归格式化分类数组;
  备注:
  */
  public function getTree($data, $CatID = 0)
  {
    unset($this->rawList);
    unset($this->formatList);
    $this->rawList = $data;
    $this->_searchList($CatID);
    return $this->formatList;
  }
  /*
  功能:获取错误信息;
  属性:public;
  参数:无;
  返回:错误信息字符串;
  备注:
  */
  public function getError()
  {
    return $this->error;
  }
  /*
  功能:检查分类参数$CatID,是否为空;
  属性:private;
  参数:分类参数$CatID,整型。
  返回:正确,返回true,错误,返回false;
  备注:
  */
  private function _checkCatID($CatID)
  {
    if (intval($CatID)) {
      return true;
    } else {
      $this->error = "参数分类ID为空或者无效!";
      return false;
    }
  }
  /*
  功能:查询路径;
  属性:private;
  参数:分类参数$CatID,整型。
  返回:出错返回false;
  备注:需要TP支持
  */
  private function _searchPath($CatID)
  {
    //检查参数
    if (!$this->_checkCatID($CatID))
      return false;
    //初始化对象,查找上级Id;
    $rs = $this->model->find($CatID);
    //保存结果
    $this->formatList[] = $rs;
    $this->_searchPath($rs[$this->field['pid']]);
  }
  /*
  功能:查询给定分类id的路径;
  属性:public;
  参数:分类参数$CatID,整型。
  返回:数组;
  备注:需要TP支持
  */
  public function getPath($CatID)
  {
    unset($this->rawList);
    unset($this->formatList);
    //查询分类路径
    $this->_searchPath($CatID);
    return array_reverse($this->formatList);
  }
  /*   * **************************************以下为分类添加、修改、删除*************************************************** */
  /*
  功能:添加分类;
  属性:public;
  参数:$data,一维数组,要添加的数据,$data需要包含上级分类ID。
  返回:添加成功,返回相应的分类ID,添加失败,返回FALSE;
  备注:需要TP支持
  */
  public function add($data)
  {
    if (empty($data))
      return false;
    return $this->model->data($data)->add();
  }
  /*
  功能:修改分类;
  属性:public;
  参数:$data,一维数组,传递编辑的数据,$data需要包含要修改的分类ID。
  返回:修改成功,返回相应的分类ID,修改失败,返回FALSE;
  备注:需要TP支持
  */
  public function edit($data)
  {
    if (empty($data))
      return false;
    return $this->model->data($data)->save();
  }
  /*
  功能:删除分类;
  属性:public;
  参数:分类ID
  返回:删除成功,返回相应的分类ID,删除失败,返回FALSE;
  备注:需要TP支持
  */
  public function del($CatID)
  {
    $CatID = intval($CatID);
    if (empty($CatID))
      return false;
    $conditon[$this->field['id']] = $CatID;
    return $this->model->where($conditon)->delete();
  }
}

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

PHP 相关文章推荐
MYSQL环境变量设置方法
Jan 15 PHP
php 魔术函数使用说明
Feb 21 PHP
解析PHP中常见的mongodb查询操作
Jun 20 PHP
php获取文件大小的方法
Feb 26 PHP
php基于str_pad实现卡号不足位数自动补0的方法
Nov 12 PHP
php获取四位字母和数字的随机数的实现方法
Jan 09 PHP
php实现汉字验证码和算式验证码的方法
Mar 07 PHP
Laravel 5框架学习之子视图和表单复用
Apr 09 PHP
Zend Framework教程之MVC框架的Controller用法分析
Mar 07 PHP
PHP缓存工具XCache安装与使用方法详解
Apr 09 PHP
thinkphp5修改view到根目录实例方法
Jul 02 PHP
详细分析PHP 命名空间(namespace)
Jun 30 PHP
PHP常用字符串函数小结(推荐)
Aug 05 #PHP
PHP使用标准库spl实现的观察者模式示例
Aug 04 #PHP
PHP设计模式之观察者模式定义与用法示例
Aug 04 #PHP
PHP操作redis实现的分页列表,新增,删除功能封装类与用法示例
Aug 04 #PHP
PHP一致性hash分布式算法封装类定义与用法示例
Aug 04 #PHP
PHP实现的函数重载功能示例
Aug 03 #PHP
thinkPHP5框架导出Excel文件简单操作示例
Aug 03 #PHP
You might like
PHP中的类-什么叫类
2006/11/20 PHP
基于PHP常用函数的用法详解
2013/05/10 PHP
PHP实现格式化文件数据大小显示的方法
2015/01/03 PHP
详谈PHP面向对象中常用的关键字和魔术方法
2017/02/04 PHP
PHP微信H5支付开发实例
2018/07/25 PHP
用jscript实现列出安装的软件列表
2007/06/18 Javascript
JavaScript Event学习第四章 传统的事件注册模型
2010/02/07 Javascript
JQuery 自定义CircleAnimation,Animate方法学习笔记
2011/07/10 Javascript
Prototype源码浅析 String部分(四)之补充
2012/01/16 Javascript
js单词形式的运算符
2014/05/06 Javascript
手机端网页点击链接触发自动拨打或保存电话的示例代码
2014/08/15 Javascript
jQuery实现首页顶部可伸缩广告特效代码
2015/04/15 Javascript
JS实现新浪博客左侧的Blog管理菜单效果代码
2015/10/22 Javascript
JavaScript中的this使用详解
2016/07/27 Javascript
jQuery实现点击任意位置弹出层外关闭弹出层效果
2016/10/19 Javascript
NW.js 简介与使用方法
2018/02/01 Javascript
判断js数据类型的函数实例详解
2019/05/23 Javascript
JS实现表单中点击小眼睛显示隐藏密码框中的密码
2020/04/13 Javascript
js实现星星打分效果
2020/07/05 Javascript
Vue实现input宽度随文字长度自适应操作
2020/07/29 Javascript
JavaScript事件概念详解(区分静态注册和动态注册)
2021/02/05 Javascript
python生成器表达式和列表解析
2016/03/10 Python
教你用 Python 实现微信跳一跳(Mac+iOS版)
2018/01/04 Python
python机器人运动范围问题的解答
2019/04/29 Python
PyCharm安装Markdown插件的两种方法
2019/06/24 Python
python selenium实现发送带附件的邮件代码实例
2019/12/10 Python
Python HTMLTestRunner可视化报告实现过程解析
2020/04/10 Python
CSS3 实现童年的纸飞机
2019/05/05 HTML / CSS
亚瑟士美国官网:ASICS美国
2017/02/01 全球购物
Old Navy加拿大官网:美式休闲服饰品牌
2017/09/26 全球购物
英国网络托管和域名领导者:Web Hosting UK
2017/10/15 全球购物
如何拷贝一整个Java对象,包括它的状态
2013/12/27 面试题
护士自荐信
2013/10/25 职场文书
大学生涯自我鉴定
2014/01/16 职场文书
质量管理标语
2014/06/12 职场文书
业绩倒数第一的检讨书
2014/09/24 职场文书