php代码:——————————————————————————–

/* 名称: 对分类操作的业务逻辑封装

*

* 作者: 帅的像人渣 qq: 1191391 e-mail: netcat2@21cn.com

*

* 完成日期: 2003-12-18 13:33

*

* 说明: 本类中引用的其它类(db、table、item)均未提供,所以本类只能做个参考,不能直接应用

* 不是本人小气不提供其它类,实在是因为那些都是一两年前写的类,很烂。怕大家看后对大

* 造成误导. 在此发表这个类,只希望大家能从中学到一些程序设计的方法。

* 授人以鱼不如授人以渔~

*

* 特点:

* 采用递归调用的方法,对分类数据只需一次数据库查询可生成树状结构。 无限递归层次(视机器堆栈而定)

*

* 数据库定义:

* id smallint unsigned primary #如果数据量很大可用int

* parentid smallint unsigned index #如果数据量很大可用int, 请索引此字段

* #如果为根分类,则parentid = 0

*

* rootid smallint unsigned index #如果数据量很大可用int, 请索引此字段

* #如果是根分类则rootid = 0, 否则rootid = 最上层的父分类id

* categoryname varchar(n) #此大小自定

* 如需有其它字段定义附在后面

* 注意事项:

* 不要试图直接调用本类,除非你有和我定义那另外那几个类相对应的接口, 否则不会成功

* 在合适的地方定义 dbtable_category 这个常量,使其指向你的分类数据表名字

*

* 程序构架:

* ├─基础类

* │

* │

* └─业务逻辑层(此类所处层次)

* │

* │

* └───表现层(用户界面)

*/

define(dbtable_category, xxx);

class category_logic

{

var $kernelref = null; //系统核心的引用

var $tblobj = null; //包含当前分类数据 table 类的实例

var $_currentitem = null; //包含当前分类数据 titem类的实例

var $categoryid = 0; //当前分类id,如果没有当前分类此项为 0

//—————————————————————————

//private array getnodedata(array $data, int $parentnode)

// 根据一颗指定根的并且以兄弟双亲法表示的树和当前分类的id,返回当前分类在整个分类表中所处的位置

//

// @param: $data 2维数组 array(

// array(

// id => 分类id,

// parentid => 父分类id,

// rootid => 根分类id,

// categoryname => 分类名称,

// ),

// ……

// );

// 表示的一颗树

//

// @param: $parentnode 父分类id, 每一次由调用者给出,递归时由程序计算传递

//

// return value: 返回以兄弟双亲法表示的所有分类的树

// 注意: 确保当前分类已经设置,否则此函数无返回

//

//—————————————————————————

function getnodedata($data, $parentnode)

{

$arr = array();

$arraycount = 0;

for($i = 0, $cnt = count($data); $i < $cnt; $i++)

{

if($data[$i][parentid] == $parentnode)

{

$arr[$arraycount] = $data[$i];

$arr[$arraycount++][child] = $this->getnodedata($data, $data[$i][id]);

}

}

return $arr;

}

//—————————————————————————

//private string _currentlevel(array $data, int $current, string $processfunc = )

// 根据一颗指定根的并且以兄弟双亲法表示的树和当前分类的id,返回当前分类在整个分类表中所处的位置

//

// @param: $data 兄弟双亲法表示的树, 由调用者传递

//

// @param: $current 当前分类id,第一次调用时由调用者给出,递归时由程序自行计算

//

// @param: $processfunc 指定对分类数据的处理函数, 函数原型定义见 $this->printcurrentlevel 中的注释

//

// return value: 返回当前分类在分类树中的位置

// 注意: 确保当前分类已经设置,否则此函数无返回

//

//—————————————————————————

function _currentlevel($data, $current, $processfunc = )

{

for($i = 0; $i < count($data); $i++)

{

if($data[$i][id] == $current)

{

if($data[$i][parentid] != 0)

{

$str = $this->_currentlevel($data, $data[$i][parentid], $processfunc) . -> ;

if($processfunc) $str .= $processfunc($data[$i]);

else $str .= $data[$i][categoryname];

}

else

{

if($processfunc) $str = $processfunc($data[$i]);

else $str = $data[$i][categoryname];

}

break;

}

}

return $str;

}

//—————————————————————————

//public category_logic(object &$kernel, int $categoryid = -1)

// 本类构造函数

//

// @param: $kernel 此参数为当前系统核心类的一个引用, 核心类中包括

// 数据库类、输入输出类、系统配置类等

//

// @param: $categoryid 当前分类id。

// 当想调用 printcurrentlevel、getrootid、getparentid、generatetypetreelist及

// 调用_currentitem成员的方法时请先设置此值.

//

// 调用generatetypetreelist时设置此值,则没有id为此的分类默认被选择,没设置则无默认

//

// return value: none

//

//—————————————————————————

function &category_logic(&$kernel, $categoryid = -1)

{

$this->kernelref = &$kernel;

$this->tblobj = new table($kernel->dbobj, dbtable_category);

if($categoryid != -1)

{

$this->setcategoryid($categoryid);

}

}

//—————————————————————————

//public void setcategoryid(int $categoryid)

// 设置当前分类id

//

// return value: none

//

//—————————————————————————

function setcategoryid($categoryid)

{

if(!$categoryid) return;

$item = new titem($this->kernelref->dbobj, dbtable_category, *, $categoryid ,id);

$this->_selfdata = &$item;

$this->categoryid = $categoryid;

}

//—————————————————————————

//public int getrootid()

// 返回当前分类的根分类id

// 注意:只有设置的当前分类时此函数才有效

//

// return value: 返回当前分类的根分类id

//

//—————————————————————————

function getrootid()

{

return $this->_selfdata->get(rootid);

}

//—————————————————————————

//public int getparentid()

// 返回当前分类的父分类id

// 注意:只有设置的当前分类时此函数才有效

//

// return value: 返回当前分类的父分类id

//

//—————————————————————————

function getparentid()

{

if($this->categoryid) return $this->_selfdata->get(parentid);

}

//—————————————————————————

//public string generatetypetreelist(array $data, string $processfunc, int $floor = 0)

// 返回整个分类的树状结构放在optionlist中的列表

//

// @param: $data 此参数由 $this->dumptypedatatotree() 返回

//

// @param: $processfunc 处理显示分类信息的回调函数, 函数原型请参照: $this->printcurrentlevel()

//

// @param: $floor 本参数不能人为给出,是程序自动计算的中间值

//

// return value:

// 结构为一颗兄弟双亲表示法表示的树

// 设如分类数据如下:

// ├──1级分类

// │

// │

// │

// ├─2级分类

// │ │

// │ └─3级分类

// │

// └─2级分类

//

// 则返回值为 array(

// 0 => array(

// id => ,

// parentid => ,

// rootid => ,

// categoryname => ,

// child => ….

// )

// …..

// )

//

//—————————————————————————

function dumptypedatatotree($rootid = 0, $fields = *)

{

$this->tblobj->setfields($fields);

$this->tblobj->setcondition();

$list = $this->tblobj->mapresult($this->tblobj->select());

return $this->getnodedata($list, $rootid);

}

//—————————————————————————

//public string generatetypetreelist(array $data, string $processfunc = , int $floor = 0)

// 返回整个分类的树状结构放在optionlist中的列表

//

// @param: $data 此参数由 $this->dumptypedatatotree() 返回

//

// @param: $processfunc 处理显示分类信息的回调函数, 函数原型请参照: $this->printcurrentlevel()

//

// @param: $floor 本参数不能人为给出,是程序自动计算的中间值

//

// return value: 返回一个分类名称1 … 分类名称n

//

// ps: 调用时echo "" . $_c->generatetypetreelist($data, processfunc) . "";

//

//—————————————————————————

function generatetypetreelist($data, $processfunc, $floor = 0)

{

$str = ;

for($i = 0, $cnt = count($data); $i < $cnt; $i++)

{

if($this->categoryid == $data[$i][id])

{

$str .= ""

. str_repeat(" ", $floor * 3)

. ├

. ($processfunc ? $processfunc($data[$i]) : $data[$i][categoryname])

. "\n";

}

else

{

$str .= ""

. str_repeat(" ", $floor * 3)

. ├

. ($processfunc ? $processfunc($data[$i]) : $data[$i][categoryname])

. "\n";

}

if($data[$i][child]) $str .= $this->generatetypetreelist($data[$i][child], $processfunc, $floor + 1);

}

return $str;

}

//—————————————————————————

//public string generatetypetreeview(array $data, string $processfunc = )

// 返回整个分类的树状结构视图

//

// @param: $data 此参数由 $this->dumptypedatatotree() 返回

//

// @param: $processfunc 处理显示分类信息的回调函数, 函数原型请参照: $this->printcurrentlevel()

//

// return value: 返回生成的一颗html形式显示的树

//

//—————————————————————————

function generatetypetreeview($data, $processfunc)

{

$str =

  • ;

for($i = 0, $cnt = count($data); $i < $cnt; $i++)

{

if($processfunc) $str .=

. $processfunc($data[$i]) . . "\n";

else $str .=

. $data[$i][categoryname] . . "\n";

if($data[$i][child]) $str .=

. $this->generatetypetreeview($data[$i][child], $processfunc) . ;

}

$str .=

;

return $str;

}

//—————————————————————————

//public string printcurrentlevel(string $processfunc = )

// 对多级分类生成当前位置字符串

// 设如分类数据如下,当前分类为3级分类, 则调用返回 1级分类 -> 2级分类 -> 3级分类

// ├──1级分类

// │

// │

// │

// ├─2级分类

// │ │

// │ └─3级分类

// │

// └─2级分类

//

//

//

//

// @param: $processfunc 此为对分类数据如何显示的回调函数,不设置则直接显示分类名称

// 函数定义原型为 function (&$arr);

// 其中$arr参数为每一个分类信息的一维数组如下:

// array(id => 1, parentid => 0, rootid => 0, categoryname => 1级分类)

// 返回值为对上述数据处理的结果,比如返回带链接的分类名字、更改显示颜色等

//

// return value: 返回当前分类在整个分类树中所处位置

//

//—————————————————————————

function printcurrentlevel($processfunc = )

{

if(!$this->categoryid) return ;

if($this->_selfdata->get("rootid") == 0)

{

if($processfunc) return $processfunc($this->_selfdata->fetchdatatoarray());

else return $this->_selfdata->get("categoryname");

}

$current = $this->categoryid;

$this->tblobj->setcondition(rootid = . $this->_selfdata->get(rootid) . " or id = " . $this->_selfdata->get(rootid));

$data = $this->tblobj->mapresult($this->tblobj->select());

return $this->_currentlevel($data, $current, $processfunc);

}

//—————————————————————————

//public boolean add(array $arr)

// 添加新分类到分类表中

//

// @param: $arr 在此数组中包括对新添加分类的定义, 定义如下:

//

// $arr[rootid] 新分类所属的根分类id

// $arr[parentid] 新分类的父分类id

// $arr[categoryname] 新分类的名称

//

// return value: 返回添加分类操作结果

//

//—————————————————————————

function add($arr)

{

$this->tblobj->setfields(

array(

rootid,

parentid,

categoryname,

)

);

return $this->tblobj->insert(

array(

$arr[rootid],

$arr[parentid],

$arr[categoryname],

)

);

}

//—————————————————————————

//public boolean delete(int $id)

// 删除已经存在的分类

//

// @param: $id 要删除的分类id

//

// return value: 返回删除分类操作结果

//

//—————————————————————————

function delete($id)

{

$sysoption = &$this->kernelref->config;

$this->tblobj->setfields(*);

$this->tblobj->setcondition(id = . (int)$id);

return $this->tblobj->delete();

}

//—————————————————————————

//public boolean modify(int $id, array $arr)

// 修改已经存在的分类

//

// @param: $id 要修改的分类id

// @param: $arr 在此数组中包括修改后的分类定义, 定义如下:

//

// $arr[rootid] 新分类所属的根分类id

// $arr[parentid] 新分类的父分类id

// $arr[categoryname] 新分类的名称

//

// return value: 返回修改分类操作结果

//

//—————————————————————————

function modify($id, $arr)

{

$this->tblobj->setcondition(id = . (int)$id);

$prev = $this->tblobj->maponerow($this->tblobj->select());

$this->tblobj->setfields(

array(

rootid,

parentid,

categoryname,

)

);

return $this->tblobj->update($arr);

}

//—————————————————————————

//public array modify(int $id)

// 修改已经存在的分类

//

// @param: $id 指定的分类id

//

// return value: 返回指定id分类的信息

// 数组中包括:

// array(

// id => 分类id,

// parentid => 父分类id,

// rootid => 根分类id,

// categoryname => 分类名称,

// );

//

//—————————————————————————

function getcategory($id)

{

$this->tblobj->setcondition(id = . (int)$id);

return $this->tblobj->maponerow($this->tblobj->select());

}

}

?>

无限分类的逻辑 php,一个无限分类的处理类-PHP教程,PHP应用相关推荐

  1. 分类算法-逻辑回归与二分类

    逻辑回归(Logistic Regression)是机器学习中的一种分类模型,逻辑回归是一种分类算法,虽然名字中带有回归,但是它与回归之间有一定的联系.由于算法的简单和高效,在实际中应用非常广泛. 1 ...

  2. R语言使用R基础安装中的glm函数构建乳腺癌二分类预测逻辑回归模型、分类预测器(分类变量)被自动替换为一组虚拟编码变量、summary函数查看检查模型、使用table函数计算混淆矩阵评估分类模型性能

    R语言使用R基础安装中的glm函数构建乳腺癌二分类预测逻辑回归模型(Logistic regression).分类预测器(分类变量)被自动替换为一组虚拟编码变量.summary函数查看检查模型.使用t ...

  3. 螺旋无限延伸_如果有一个无限向上螺旋延伸的楼梯,人能到达多高的位置?

    参照普通人平时爬山的速度,考虑中途缓口气.休息喝水,一分钟10米差不多.考虑连续攀登,每天争取爬到6小时吧. 第一天,上午,你觉得挺累的,平时很少这样运动,不过似乎也没有想象的难.下午,你觉得有点凉, ...

  4. 机器学习:理解逻辑回归及二分类、多分类代码实践

    作者 | caiyongji   责编 | 张红月 来源 | 转载自 caiyongji(ID:cai-yong-ji) 本文的概念相对简单,主要侧重于代码实践.现实生活中不止有预测的问题还有分类的问 ...

  5. 无限极分类中递归查找一个树结构

    问题:设计公司的员工表,员工有不同级别,要求可通过一个员工查到其下属的所有员工,也可查到其所属的上级. 解决:递归实现无限分类思想,每一个员工存入其所属的上级的id作为自己的pid,另外存入path, ...

  6. php 类分开写,自己前几天写的无限分类类_PHP教程

    自己前几天写的无限分类类_PHP教程 前一周写的吧,使用中效果还不错. 主要思想来自:http://www.phpobject.net/b...[url=http://www.phpobject.ne ...

  7. php查询下级分类,php+mysql查询实现无限下级分类树输出示例

    本文实例讲述了php+mysql查询实现无限下级分类树输出.分享给大家供大家参考,具体如下: 这里介绍的php结合mysql查询无限下级树输出,其实就是无限分类.给各位整理了几个php无限分类的例子. ...

  8. 机器学习(一)——线性回归、分类与逻辑回归

    http://antkillerfarm.github.io/ 序 这是根据Andrew Ng的<机器学习讲义>,编写的系列blog. http://www.cnblogs.com/jer ...

  9. Logistic逻辑回归(sigmod二分类)成本函数推导 及其梯度下降

    logistic逻辑回归是比较常用的二分分类,其激活函数适用于各种二分类场景,但是其函数在t极大或者极小的时候趋于饱和会引发梯度消失,影响网络调参使得函数不能很好的收敛 有兴趣的同学可以参阅我的上一篇 ...

最新文章

  1. UA MATH566 统计理论1 充分统计量例题答案2
  2. linux命令之查看动态库符号-nm
  3. C语言指针,申请、释放内存,线程
  4. mysql排序规则错误_MySQL中“非法混合排序规则”错误的疑难解答
  5. 积分图像 Integral
  6. Vue cli项目开启Gzip
  7. java构造方法可以是私有的吗_Java中的构造函数可以私有吗?
  8. 爬虫_4、requests的post方法以及json字符串处理
  9. ZZNUOJ_C语言1039:n个数求和(完整代码)
  10. MTTR、MTTF、MTBF
  11. 照片纸特效多画面滚动动画展示PR视频剪辑模板
  12. using werkzeug to build a shorly url app
  13. Windows10 运行 WSA
  14. 密码打马赛克已经不安全了!这款开源的去“马赛克“工具一秒还原
  15. 2022.9.15 第1次周报
  16. mysql对表中添加属性_mysql alter用法总结
  17. linux异步io 回调函数,Linux异步IO
  18. 动态规划 求第 n 个 Humble Number(丑数)
  19. rtx4000显卡什么级别 rtx4000显卡属于哪个级别
  20. 机器人 郑佳佳_浙大毕业生娶了亲手造的机器人当老婆婚礼都办了!

热门文章

  1. QQ群关系可视化3D查询搭建
  2. 我的博客之旅--赠人玫瑰,手留余香
  3. c++提取文件名中数字
  4. 织梦CMS免费已成梦,商用5800元一个站你觉得贵吗?
  5. C++ 算法设计:鸡兔同笼问题的多种求解方法
  6. 使用Filezilla连接到Amazon EC2上传查看文件
  7. 免费PDF转换网页版
  8. LabVIEW - DAQmx 数据采集
  9. JSP页面显示本地图片
  10. 使用VirtualBox安装Ubuntu系统