您的位置:首页 > 编程语言 > PHP开发

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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: