无限分类的逻辑 php,一个无限分类的处理类-PHP教程,PHP应用
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应用相关推荐
- 分类算法-逻辑回归与二分类
逻辑回归(Logistic Regression)是机器学习中的一种分类模型,逻辑回归是一种分类算法,虽然名字中带有回归,但是它与回归之间有一定的联系.由于算法的简单和高效,在实际中应用非常广泛. 1 ...
- R语言使用R基础安装中的glm函数构建乳腺癌二分类预测逻辑回归模型、分类预测器(分类变量)被自动替换为一组虚拟编码变量、summary函数查看检查模型、使用table函数计算混淆矩阵评估分类模型性能
R语言使用R基础安装中的glm函数构建乳腺癌二分类预测逻辑回归模型(Logistic regression).分类预测器(分类变量)被自动替换为一组虚拟编码变量.summary函数查看检查模型.使用t ...
- 螺旋无限延伸_如果有一个无限向上螺旋延伸的楼梯,人能到达多高的位置?
参照普通人平时爬山的速度,考虑中途缓口气.休息喝水,一分钟10米差不多.考虑连续攀登,每天争取爬到6小时吧. 第一天,上午,你觉得挺累的,平时很少这样运动,不过似乎也没有想象的难.下午,你觉得有点凉, ...
- 机器学习:理解逻辑回归及二分类、多分类代码实践
作者 | caiyongji 责编 | 张红月 来源 | 转载自 caiyongji(ID:cai-yong-ji) 本文的概念相对简单,主要侧重于代码实践.现实生活中不止有预测的问题还有分类的问 ...
- 无限极分类中递归查找一个树结构
问题:设计公司的员工表,员工有不同级别,要求可通过一个员工查到其下属的所有员工,也可查到其所属的上级. 解决:递归实现无限分类思想,每一个员工存入其所属的上级的id作为自己的pid,另外存入path, ...
- php 类分开写,自己前几天写的无限分类类_PHP教程
自己前几天写的无限分类类_PHP教程 前一周写的吧,使用中效果还不错. 主要思想来自:http://www.phpobject.net/b...[url=http://www.phpobject.ne ...
- php查询下级分类,php+mysql查询实现无限下级分类树输出示例
本文实例讲述了php+mysql查询实现无限下级分类树输出.分享给大家供大家参考,具体如下: 这里介绍的php结合mysql查询无限下级树输出,其实就是无限分类.给各位整理了几个php无限分类的例子. ...
- 机器学习(一)——线性回归、分类与逻辑回归
http://antkillerfarm.github.io/ 序 这是根据Andrew Ng的<机器学习讲义>,编写的系列blog. http://www.cnblogs.com/jer ...
- Logistic逻辑回归(sigmod二分类)成本函数推导 及其梯度下降
logistic逻辑回归是比较常用的二分分类,其激活函数适用于各种二分类场景,但是其函数在t极大或者极小的时候趋于饱和会引发梯度消失,影响网络调参使得函数不能很好的收敛 有兴趣的同学可以参阅我的上一篇 ...
最新文章
- UA MATH566 统计理论1 充分统计量例题答案2
- linux命令之查看动态库符号-nm
- C语言指针,申请、释放内存,线程
- mysql排序规则错误_MySQL中“非法混合排序规则”错误的疑难解答
- 积分图像 Integral
- Vue cli项目开启Gzip
- java构造方法可以是私有的吗_Java中的构造函数可以私有吗?
- 爬虫_4、requests的post方法以及json字符串处理
- ZZNUOJ_C语言1039:n个数求和(完整代码)
- MTTR、MTTF、MTBF
- 照片纸特效多画面滚动动画展示PR视频剪辑模板
- using werkzeug to build a shorly url app
- Windows10 运行 WSA
- 密码打马赛克已经不安全了!这款开源的去“马赛克“工具一秒还原
- 2022.9.15 第1次周报
- mysql对表中添加属性_mysql alter用法总结
- linux异步io 回调函数,Linux异步IO
- 动态规划 求第 n 个 Humble Number(丑数)
- rtx4000显卡什么级别 rtx4000显卡属于哪个级别
- 机器人 郑佳佳_浙大毕业生娶了亲手造的机器人当老婆婚礼都办了!