php 无限级分类 缓存

<?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

 

解决了pid不是数字的bug,因为php中,如果数字跟字符串用 ==比对的话,会把字符串认为是0

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值