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 相关文章推荐
投票管理程序
Oct 09 PHP
php 数组的指针操作实现代码
Feb 08 PHP
PHP+Mysql日期时间如何转换(UNIX时间戳和格式化日期)
Jul 15 PHP
PHP导出EXCEL快速开发指南--PHPEXCEL的使用详解
Jun 03 PHP
php二分查找二种实现示例
Mar 12 PHP
php cli换行示例
Apr 22 PHP
PHP给源代码加密的几种方法汇总(推荐)
Feb 06 PHP
thinkPHP5框架实现基于ajax的分页功能示例
Jun 12 PHP
详解Laravel5.6 Passport实现Api接口认证
Jul 27 PHP
Yii框架使用PHPExcel导出Excel文件的方法分析【改进版】
Jul 24 PHP
PHP保存Base64图片base64_decode的问题整理
Nov 04 PHP
PHP 命名空间和自动加载原理与用法实例分析
Apr 29 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 xfocus防注入资料
2008/04/27 PHP
PHP缓存技术的使用说明
2011/08/06 PHP
关于PHP的curl开启问题探讨
2014/04/08 PHP
PHP小偷程序的设计与实现方法详解
2016/10/15 PHP
PHP编程计算两个时间段是否有交集的实现方法(不算边界重叠)
2017/05/30 PHP
浅谈PHP中new self()和new static()的区别
2017/08/11 PHP
php 使用 __call实现重载功能示例
2019/11/18 PHP
laravel 框架结合关联查询 when()用法分析
2019/11/22 PHP
2020最新版 PhpStudy V8.1版本下载安装使用详解
2020/10/30 PHP
拖动table标题实现改变td的大小(css+js代码)
2013/04/16 Javascript
js实现楼层效果的简单实例
2016/07/15 Javascript
jQuery自适应轮播图插件Swiper用法示例
2016/08/24 Javascript
各式各样的导航条效果css3结合jquery代码实现
2016/09/17 Javascript
JS简单实现获取元素的封装操作示例
2017/04/07 Javascript
vue.js实现只弹一次弹框
2018/01/29 Javascript
基于Vue自定义指令实现按钮级权限控制思路详解
2018/05/23 Javascript
Vue唯一可以更改vuex实例中state数据状态的属性对象Mutation的讲解
2019/01/18 Javascript
微信小程序单选框自定义赋值
2020/05/26 Javascript
vue中echarts图表大小适应窗口大小且不需要刷新案例
2020/07/19 Javascript
JavaScript实现网页留言板功能
2020/11/23 Javascript
[02:43]DOTA2英雄基础教程 半人马战行者
2014/01/13 DOTA
编写Python的web框架中的Model的教程
2015/04/29 Python
python去除文件中空格、Tab及回车的方法
2016/04/12 Python
Python获取linux主机ip的简单实现方法
2016/04/18 Python
Python实现句子翻译功能
2017/11/14 Python
TensorFlow实现简单卷积神经网络
2018/05/24 Python
使用Python检测文章抄袭及去重算法原理解析
2019/06/14 Python
Pandas时间序列重采样(resample)方法中closed、label的作用详解
2019/12/10 Python
html5 localStorage本地存储_动力节点Java学院整理
2017/07/06 HTML / CSS
欠款纠纷起诉状
2015/05/19 职场文书
小学英语教学经验交流材料
2015/11/02 职场文书
2016年暑期见闻作文
2015/11/25 职场文书
读鲁迅先生的经典名言
2019/08/20 职场文书
SQL Server——索引+基于单表的数据插入与简单查询【1】
2021/04/05 SQL Server
LayUI+Shiro实现动态菜单并记住菜单收展的示例
2021/05/06 Javascript
CSS实现隐藏搜索框功能(动画正反向序列)
2021/07/21 HTML / CSS