php 无限级分类 缓存
2007-05-31 17:08
363 查看
<?php
/**
* 功能: 根据条件建立分类缓存减少类别使用
* 创建日期:Thu May 31 15:55:11 CST 2007
* 最后更新:
* 作者: sanshi <sanshi0815@tom.com>
*/
class treeCache
{
var $tableName = "index_category"; //表名
var $where = "1"; //where条件
var $pidStr ="i_c_pid"; //pid 的字段名
var $tempCode = array(); //生成文件的数组
var $pid = 0; //pid的初始值
var $db ; //数据库句柄
var $idStr="i_c_id"; //取得的数据id
var $title = "i_c_cn"; //名字字段
var $createArrayName = "treeCache"; //建立的数组名字
var $createFileName =""; //建立文件的名字
var $appendArr = array(); //附加的属性,需要字段名与数据里的名对应
function treeCache($db)
{
$this->db = $db;
$this->tempCode[] = "<?php";
}
//取得所有的一级
function getRootID()
{
$sql = "SELECT {$this->idStr} FROM {$this->tableName} WHERE
{$this->pidStr}={$this->pid} AND {$this->where} ";
$result = $this->db->select($sql);
$temp = array();
foreach ($result as $r)
{
$temp[]=$r["{$this->idStr}"];
}
$this->tempCode[] = "${$this->createArrayName}['root']='".implode(',',$temp)."';";
//print_r($temp);
return $temp;
}
//取得子id
function getChildren($pid)
{
$sql = "SELECT {$this->idStr} FROM {$this->tableName} WHERE
{$this->pidStr}={$pid} AND {$this->where} ";
$result = $this->db->select($sql);
$temp = array();
foreach ($result as $r)
{
$temp[]=$r["{$this->idStr}"];
}
return $temp;
}
//取得夫id
function getParent($cid)
{
$sql = "SELECT {$this->pidStr} FROM {$this->tableName} WHERE
{$this->idStr}={$cid} AND {$this->where} ";
$result = $this->db->select($sql);
return $result[0]["{$this->pidStr}"];
}
//取得上级的id
function getPidStr($cid,$pidStr="")
{
$pid=$this->getParent($cid);
$temp = array();
while ($pid!=$this->pid && !empty($pid)) {
$temp[] = $pid;
$pid=$this->getParent($pid);
}
//print_r($temp);
return implode(',',$temp);
}
//取得深度
function getDepth($cid,$depth=0)
{
$pid=$this->getParent($cid);
$depth++;
if($pid!==$this->pid && !empty($pid))
$depth = $this->getDepth($pid,$depth);
return $depth;
}
//建立文件
function make()
{
if(empty($this->createFileName))
$this->createFileName = "{$this->createArrayName}.data.php";
$rootArr = $this->getRootID();
$selectF = "{$this->idStr},{$this->title},{$this->pidStr}";
foreach ($this->appendArr as $app)
{
if(empty($app)) continue;
$selectF .=",{$app}";
}
$sql = "SELECT {$selectF} FROM {$this->tableName} WHERE
{$this->where} ORDER BY {$this->idStr} ASC";
$result = $this->db->select($sql);
for ($i=0;$i<count($result);$i++)
{
//id值
$this->tempCode[] =
"${$this->createArrayName}[{$result[$i]["$this->idStr"]}]['id']='{$result[$i]["$this->idStr"]}';";
//标题
$this->tempCode[] =
"${$this->createArrayName}[{$result[$i]["$this->idStr"]}]['title']='{$result[$i]["$this->title"]}';";
//父id
$this->tempCode[] =
"${$this->createArrayName}[{$result[$i]["$this->idStr"]}]['pid']='{$result[$i]["$this->pidStr"]}';";
//子id
$this->tempCode[] =
"${$this->createArrayName}[{$result[$i]["$this->idStr"]}]['cid']='".implode(',',$this->getChildren($result[$i]["$this->idStr"]))."';";
//目录深度
$this->tempCode[] =
"${$this->createArrayName}[{$result[$i]["$this->idStr"]}]['depth']='".$this->getDepth($result[$i]["$this->idStr"])."';";
//父id的id串
$this->tempCode[] =
"${$this->createArrayName}[{$result[$i]["$this->idStr"]}]['pstr']='".$this->getPidStr($result[$i]["$this->idStr"])."';";
//添加的附加属性
foreach ($this->appendArr as $app)
{
if(empty($app)) continue;
$this->tempCode[] =
"${$this->createArrayName}[{$result[$i]["$this->idStr"]}]['{$app}']='{$result[$i]["{$app}"]}';";
}
}
$this->tempCode[] = "?>";
//$content = implode(" ",$this->tempCode);
//print_r($this->tempCode);
include_once(CLASSES_PATH."FileIO.class.php");
$content = implode(" ",$this->tempCode);
//建立文件
FileIO::writeFile($this->createFileName,$content);
return $content ;
}
}
现在发一段简单的解析
//做分析
include_once("treeCache.data.php");
$treeCache=isset($treeCache) ? $treeCache : array();
$rootStr = isset($treeCache['root']) ? $treeCache['root'] : "";
echo parseTree($treeCache,$rootStr);
function parseTree($treeCache,$rootStr)
{
$tempStr = "";
$temp = explode(',',$rootStr);
foreach ($temp AS $cid)
{
$info = $treeCache[$cid];
$cidStr = $info['cid'];
$tempStr .= str_repeat('-',($info['depth']-1)*3);
$tempStr.=$info['title'];
if(empty($info['pid']))
{
//附加操作
}
$tempStr .= "<br/>";
if(!empty($info['cid']))
$tempStr .=parseTree($treeCache,$info['cid']);
}
return $tempStr;
}
在看一下,我们缓存生成后的文件样式
<?php
$indexCategory['root']='1,2,3,4,6';
$indexCategory[1]['id']='1';
$indexCategory[1]['title']='首页 新闻';
$indexCategory[1]['pid']='0';
$indexCategory[1]['cid']='5,7';
$indexCategory[1]['depth']='1';
$indexCategory[1]['pstr']='';
$indexCategory[2]['id']='2';
$indexCategory[2]['title']='首页娱乐';
$indexCategory[2]['pid']='0';
$indexCategory[2]['cid']='';
$indexCategory[2]['depth']='1';
$indexCategory[2]['pstr']='';
$indexCategory[3]['id']='3';
$indexCategory[3]['title']='test';
$indexCategory[3]['pid']='0';
$indexCategory[3]['cid']='';
$indexCategory[3]['depth']='1';
$indexCategory[3]['pstr']='';
$indexCategory[4]['id']='4';
$indexCategory[4]['title']='test2';
$indexCategory[4]['pid']='0';
$indexCategory[4]['cid']='';
$indexCategory[4]['depth']='1';
$indexCategory[4]['pstr']='';
$indexCategory[5]['id']='5';
$indexCategory[5]['title']='首页 新闻1';
$indexCategory[5]['pid']='1';
$indexCategory[5]['cid']='8';
$indexCategory[5]['depth']='2';
$indexCategory[5]['pstr']='1';
$indexCategory[6]['id']='6';
$indexCategory[6]['title']='werwwwwwwwww';
$indexCategory[6]['pid']='0';
$indexCategory[6]['cid']='';
$indexCategory[6]['depth']='1';
$indexCategory[6]['pstr']='';
$indexCategory[7]['id']='7';
$indexCategory[7]['title']='index test';
$indexCategory[7]['pid']='1';
$indexCategory[7]['cid']='';
$indexCategory[7]['depth']='2';
$indexCategory[7]['pstr']='1';
$indexCategory[8]['id']='8';
$indexCategory[8]['title']='etertertertrter';
$indexCategory[8]['pid']='5';
$indexCategory[8]['cid']='';
$indexCategory[8]['depth']='3';
$indexCategory[8]['pstr']='5,1';
?>
这个东西当然有些设置,还能更好的优化下,还能更灵活的使用,大家发挥吧
修改了一个bug
//取得深度 修改前 function getDepth($cid,$depth=0) { $pid=$this->getParent($cid); $depth++; if($pid!=$this->pid && !empty($pid)) $depth = $this->getDepth($pid,$depth); return $depth; } //取得深度 修改后 function getDepth($cid,$depth=0) { $pid=$this->getParent($cid); $depth++; if($pid!==$this->pid && !empty($pid)) $depth = $this->getDepth($pid,$depth); return $depth; }
解决了pid不是数字的bug,因为php中,如果数字跟字符串用 ==比对的话,会把字符串认为是0
相关文章推荐
- PHP无限级分类实现(递归+非递归)
- Php无限级栏目分类读取的实现代码
- php学习笔记六--无限级分类、递归转义
- 2款PHP无限级分类实例代码
- 2款PHP无限级分类实例代码
- 表格展示无限级分类(PHP版)
- PHP实现递归无限级分类
- php+mysql无限级分类(非递归)
- PHP无限级分类实现(递归+非递归)
- PHP+mysql 无限级分类算法
- php无限级分类实现方法分析
- php+mysql无限级分类(非递归)
- php递归无限级分类【先序遍历算】,获取任意节点下所有子孩子
- php无限级分类(地区)
- PHP无限级分类方法及代码
- PHP+MySQL无限级分类(非递归)
- PHP无限级分类的实现(不使用递归)
- php无限级分类(带层深)算法
- PHP+MySQL 无限级分类的两种实现方案
- php 递归 无限级分类 返回数组