php 无限级缓存的类的扩展

2015-01-24信息快讯网

根据条件建立分类缓存减少类别使用

<?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(); //附加的属性,需要字段名与数据里的名对应 
var $is_utf8 = false; 
function treeCache() 
{ 
} 
function set($db) 
{ 
$this->db = $db; 
$this->tempCode[] = "<?php"; 
} 
//取得所有的一级 
function getRootID() 
{ 
$sql = "SELECT {$this->idStr} FROM {$this->tableName} WHERE 
{$this->pidStr}='{$this->pid}' AND {$this->where} "; 
//exit($sql); 
$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); 
//print_r($result);exit(); 
return $result[0]["{$this->pidStr}"]; 
} 
//取得上级的id 
function getPidStr($cid,$pidStr="") 
{ 
$pid=$this->getParent($cid); 
$temp = array(); 
while ($pid!=$this->pid && !emptyempty($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 && !emptyempty($pid)) 
$depth = $this->getDepth($pid,$depth); 
return $depth; 
} 
//建立文件 
function make() 
{ 
if(emptyempty($this->createFileName)) 
$this->createFileName = "{$this->createArrayName}.data.php"; 

$rootArr = $this->getRootID(); 
$selectF = "{$this->idStr},{$this->title},{$this->pidStr}"; 
foreach ($this->appendArr as $app) 
{ 
if(emptyempty($app)) continue; 
$selectF .=",{$app}"; 
} 
$sql = "SELECT {$selectF} FROM {$this->tableName} WHERE 
{$this->where}"; 
$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(emptyempty($app)) continue; 
$this->tempCode[] = 
"\${$this->createArrayName}['{$result[$i][$this->idStr]}']['{$app}']='{$result[$i]["{$app}"]}';"; 
} 
} 
$this->tempCode[] = "return \${$this->createArrayName};"; 
$this->tempCode[] = "?>"; 
//$content = implode("\n",$this->tempCode); 
//print_r($this->tempCode); 
$content = implode("\n",$this->tempCode); 
//建立文件 
$fio=Factory::getBaseClass('FileIO'); 
if($this->is_utf8) $content = "\xEF\xBB\xBF".$content; 
$fio->writeFile($this->createFileName,$content); 
return $content ; 
} 
} 
//加载的文件就是为了,数据库连接 
//需要数据库有 select 方法 
/* 
include_once(dirname(dirname(__FILE__))."/config/config.inc.php"); 
include_once(CLASSES_PATH."factryObject.class.php"); 

$db = factryObject::getDB('indexPush'); 
$c = new treeCache($db); 
$c->make(); 
//exit(); 

//做分析 
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 
/** 
* 功能: 根据条件建立分类缓存减少类别使用 
* 创建日期: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(); //附加的属性,需要字段名与数据里的名对应 
var $is_utf8 = false; 
function treeCache() 
{ 
} 
function set($db) 
{ 
$this->db = $db; 
$this->tempCode[] = "<?php"; 
} 
//取得所有的一级 
function getRootID() 
{ 
$sql = "SELECT {$this->idStr} FROM {$this->tableName} WHERE 
{$this->pidStr}='{$this->pid}' AND {$this->where} "; 
//exit($sql); 
$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); 
//print_r($result);exit(); 
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}"; 
$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[] = "return \${$this->createArrayName};"; 
$this->tempCode[] = "?>"; 
//$content = implode("\n",$this->tempCode); 
//print_r($this->tempCode); 
$content = implode("\n",$this->tempCode); 
//建立文件 
$fio=Factory::getBaseClass('FileIO'); 
if($this->is_utf8) $content = "\xEF\xBB\xBF".$content; 
$fio->writeFile($this->createFileName,$content); 
return $content ; 
} 
} 
//加载的文件就是为了,数据库连接 
//需要数据库有 select 方法 
/* 
include_once(dirname(dirname(__FILE__))."/config/config.inc.php"); 
include_once(CLASSES_PATH."factryObject.class.php"); 

$db = factryObject::getDB('indexPush'); 
$c = new treeCache($db); 
$c->make(); 
//exit(); 

//做分析 
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; 
} 
*/ 
?> 

这个类是改善过的,当初做这个的适合,只能是数字的作为数组下标,这次支持字母了 

另外就是关于解析 

view plaincopy to clipboardprint? 
<?php 
class parseTree 
{ 
var $ads_type_file = ""; 
var $isX = false; 
var $rowSize=2; 
function parseTree() 
{ 
$this->ads_type_file = CACHE_PATH."ads_type_arr.data.php"; 
$this->ads_city_file = CACHE_PATH."ads_city_arr.data.php"; 
} 
function make_ads_type() 
{ 
$db = Factory::getDB("ads_type"); 
$tree =Factory::getItemClass('treeCache'); 
$tree->set($db); 
$tree->tableName=$db->tableName; 
$tree->pidStr ="ads_type_pid"; 
$tree->idStr = "ads_type_id"; 
$tree->title = "ads_type_name"; 
$tree->createArrayName ="ads_type_arr"; 
$tree->where = " ads_type_state=1 ORDER BY ads_type_id DESC "; 
$tree->appendArr = array("ads_type_info"); 
$tree->createFileName = $this->ads_type_file; 
$tree->is_utf8 = true; 
return $tree->make(); 
} 
function get_ads_type_str() 
{ 
$temp_arr = $this->get_ads_type_arr(); 
$treeArr = emptyempty($temp_arr) ? array() : $temp_arr; 
$rootStr = isset($temp_arr['root']) ? $temp_arr['root'] : ""; 
$show_content = $this->__parseTree($treeArr,$rootStr,'pares_type_link'); 
return $show_content; 
} 
function get_ads_type_arr() 
{ 
return is_file($this->ads_type_file) ? require($this->ads_type_file) : array(); 
} 
function pares_type_link($info) 
{ 
$class_name = "ads_type"; 
$tempStr = "[<a href="?c={$class_name}&m=add&ads_type_pid={$info[" href="?c={$class_name}&m=add&ads_type_pid={$info["id']}'>子-添加</a>]"; 
$tempStr .="[<a href="?c={$class_name}&m=edit&ads_type_id={$info[" href="?c={$class_name}&m=edit&ads_type_id={$info["id']}'>编辑</a>]"; 
$tempStr .="[<a href="?c={$class_name}&m=del&ads_type_id={$info[" href="?c={$class_name}&m=del&ads_type_id={$info["id']}'>删除</a>]"; 
return $tempStr; 
} 
//根据提供的类别号取得类别数组 
function get_type_arr($type_no=0) 
{ 
$temp_arr = $this->get_ads_type_arr(); 
$rootStr = $type_no==0 ? (isset($temp_arr['root'])?$temp_arr['root'] : "") : (isset($temp_arr[$type_no]['cid'])?$temp_arr[$type_no]['cid']:""); 
$temp = explode(',',$rootStr); 
$return_temp = array(); 
foreach($temp as $cid) 
{ 
if(isset($temp_arr[$cid])) $return_temp[$temp_arr[$cid]['id']]=$temp_arr[$cid]['title']; 
} 
return $return_temp; 
} 

function make_ads_city() 
{ 
$db = Factory::getDB("ads_city"); 
$tree =Factory::getItemClass('treeCache'); 
$tree->set($db); 
$tree->tableName=$db->tableName; 
$tree->pidStr ="ads_city_pid"; 
$tree->idStr = "ads_city_no"; 
$tree->title = "ads_city_name"; 
$tree->createArrayName ="ads_city_arr"; 
$tree->where = " ads_city_state=1 ORDER BY ads_city_no DESC "; 
$tree->appendArr = array("ads_city_info"); 
$tree->createFileName = $this->ads_city_file; 
$tree->is_utf8 = true; 
return $tree->make(); 
} 
function get_ads_city_arr() 
{ 
return is_file($this->ads_city_file) ? require($this->ads_city_file) : array(); 
} 
function get_ads_city_str() 
{ 
$temp_arr = $this->get_ads_city_arr(); 
$treeArr = emptyempty($temp_arr) ? array() : $temp_arr; 
$rootStr = isset($temp_arr['root']) ? $temp_arr['root'] : ""; 
$show_content = $this->__parseTree($treeArr,$rootStr,'pares_city_link'); 
return $show_content; 
} 
function pares_city_link($info) 
{ 
$class_name = "ads_city"; 
$tempStr = "[<a href="?c={$class_name}&m=add&ads_city_pid={$info[" href="?c={$class_name}&m=add&ads_city_pid={$info["id']}'>子-添加</a>]"; 
$tempStr .="[<a href="?c={$class_name}&m=edit&ads_city_no={$info[" href="?c={$class_name}&m=edit&ads_city_no={$info["id']}'>编辑</a>]"; 
$tempStr .="[<a href="?c={$class_name}&m=del&ads_city_no={$info[" href="?c={$class_name}&m=del&ads_city_no={$info["id']}'>删除</a>]"; 
return $tempStr; 
} 
//根据提供的城市号取得城市数组 
function get_city_arr($city_no=0) 
{ 
$temp_arr = $this->get_ads_city_arr(); 
$rootStr = $city_no==0 ? (isset($temp_arr['root'])?$temp_arr['root'] : "") : (isset($temp_arr[$city_no])?$temp_arr[$city_no]:""); 
$temp = explode(',',$rootStr); 
$return_temp = array(); 
foreach($temp as $cid) 
{ 
if(isset($temp_arr[$cid])) $return_temp[$temp_arr[$cid]['id']]=$temp_arr[$cid]['title']; 
} 
return $return_temp; 
} 

function __parseTree($treeCache,$rootStr,$fuc_str) 
{ 
$tempStr = ""; 
$temp = explode(',',$rootStr); 
if(emptyempty($temp)) return ""; 
$this->layer=0; 
foreach ($temp AS $cid) 
{ 
if(isset($treeCache[$cid])) 
{ 
$info = $treeCache[$cid]; 
$cidStr = $info['cid']; 
//如果下面有子id 
if($info["cid"]!="") 
{ 
$tempStr .="<div >"; 
$tempStr .= str_repeat(' ',($info['depth']-1)*3); 
if($info["cid"]!="") 
{ 
//$tempStr .="<img src="/images/arrow.jpg" src="images/arrow.jpg" style="cursor:hand;" style="cursor:hand;" onClick='javascript:ShowMenu(\"l_{$info['id']}\");' id='pic_l_{$info['id']}'>"; 
} 
//$tempStr .=">"; 
$tempStr.=$info['title']; 
$tempStr .=$this->{$fuc_str}($info); 
$tempStr .="</div>"; 
$tempStr .="<div id='l_{$info['id']}' >"; 
$tempStr .= $this->__parseTree($treeCache,$info['cid'],$fuc_str); 
$tempStr .="</div>"; 
}else{ 
$this->layer++; 
$tempStr .= str_repeat(' ',($info['depth']-1)*3); 
$tempStr.=$info['title']; 
$tempStr .=$this->{$fuc_str}($info); 
if($this->isX==true) 
{ 
if($this->layer % $this->rowSize ==0) 
$tempStr .= "<br/>"; 
else 
$tempStr .= " "; 
}else{ 
$tempStr .= "<br/>"; 
} 
} 
} 
} 
return $tempStr; 
} 
} 
?> 

©2014-2024 dbsqp.com