php 无限级缓存的类的扩展


Posted in PHP onMarch 16, 2009
<?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; 
} 
} 
?>
PHP 相关文章推荐
在同一窗体中使用PHP来处理多个提交任务
May 08 PHP
php正则表达式学习笔记
Nov 13 PHP
php session的锁和并发
Jan 22 PHP
PHP实现文件上传与下载实例与总结
Mar 13 PHP
PHP Oauth授权和本地加密实现方法
Aug 12 PHP
php基于数组函数实现关联表的编辑操作示例
Jul 04 PHP
PHPMailer使用QQ邮箱实现邮件发送功能
Aug 18 PHP
PHP 中魔术常量的实例详解
Oct 26 PHP
PHP实现的折半查找算法示例
Dec 19 PHP
php 读写json文件及修改json的方法
Mar 07 PHP
laravel-admin 管理平台获取当前登陆用户信息的例子
Oct 08 PHP
php传值和传引用的区别点总结
Nov 19 PHP
解决163/sohu/sina不能够收到PHP MAIL函数发出邮件的问题
Mar 13 #PHP
PHP 文件类型判断代码
Mar 13 #PHP
php discuz 主题表和回帖表的设计
Mar 13 #PHP
php 获取mysql数据库信息代码
Mar 12 #PHP
php 删除记录实现代码
Mar 12 #PHP
php 异常处理实现代码
Mar 10 #PHP
php 表单数据的获取代码
Mar 10 #PHP
You might like
基于mysql的论坛(3)
2006/10/09 PHP
PHP轻量级数据库操作类Medoo增加、删除、修改、查询例子
2014/07/04 PHP
Codeigniter检测表单post数据的方法
2015/03/21 PHP
php文件读取方法实例分析
2015/06/20 PHP
JavaScript Undefined,Null类型和NaN值区别
2008/10/22 Javascript
JavaScript在for循环中绑定事件解决事件参数不同的情况
2014/01/20 Javascript
使用Node.js处理前端代码文件的编码问题
2016/02/16 Javascript
AngularJS轻松实现双击排序的功能
2016/08/30 Javascript
jQuery层级选择器实例代码
2017/02/06 Javascript
关于jQuery中fade(),show()起始位置的一点小发现
2017/04/25 jQuery
vue+iview写个弹框的示例代码
2017/12/05 Javascript
vue中过滤器filter的讲解
2019/01/21 Javascript
ES6基础之解构赋值(destructuring assignment)
2019/02/21 Javascript
详谈vue中router-link和传统a链接的区别
2020/07/22 Javascript
js实现数字跳动到指定数字
2020/08/25 Javascript
JavaScript arguments.callee作用及替换方案详解
2020/09/02 Javascript
[50:44]DOTA2-DPC中国联赛 正赛 SAG vs Dragon BO3 第二场 2月22日
2021/03/11 DOTA
Python获取单个程序CPU使用情况趋势图
2015/03/10 Python
python分析作业提交情况
2017/11/22 Python
pandas 小数位数 精度的处理方法
2018/06/09 Python
Python3.5以上版本lxml导入etree报错的解决方案
2019/06/26 Python
python绘制已知点的坐标的直线实例
2019/07/04 Python
Python数据处理篇之Sympy系列(五)---解方程
2019/10/12 Python
python 利用turtle模块画出没有角的方格
2019/11/23 Python
python 实现屏幕录制示例
2019/12/23 Python
pytorch 修改预训练model实例
2020/01/18 Python
python下对hsv颜色空间进行量化操作
2020/06/04 Python
华润集团网上药店:健一网
2016/09/19 全球购物
英国家具、照明、家居用品网上商店:Wayfair.co.uk
2020/02/13 全球购物
如何删除一个表里面的重复行
2013/07/13 面试题
物业电工岗位职责
2013/11/20 职场文书
司法局群众路线教育实践活动整改措施思想汇报
2014/10/13 职场文书
简易版租房协议书范本
2014/10/13 职场文书
财务整改报告范文
2014/11/05 职场文书
先进基层党组织主要事迹材料
2015/11/03 职场文书
Python 数据结构之十大经典排序算法一文通关
2021/10/16 Python