php 无限级缓存的类的扩展
2018-09-07 22:06
复制代码 代码如下:
<?php
/**
* 功能: 根据条件建立分类缓存减少类别使用
* 创建日期:Thu May 31 15:55:11 CST 2007
* 最后更新:
* 作者gt;
*/
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(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
* 最后更新:
* 作者>
*/
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;
}
}
?>
上一篇:Yii2数据库操作常用方法小结