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创建多级目录代码
Jun 05 PHP
php 更新数据库中断的解决方法
Jun 05 PHP
php读取csv文件并输出的方法
Mar 14 PHP
php使用GD库创建图片缩略图的方法
Jun 10 PHP
PHP代码实现爬虫记录――超管用
Jul 31 PHP
摘自织梦CMS中的图片处理类
Aug 08 PHP
PHP中addslashes()和stripslashes()实现字符串转义和还原用法实例
Jan 07 PHP
CI框架无限级分类+递归的实现代码
Nov 01 PHP
PHP绕过open_basedir限制操作文件的方法
Jun 10 PHP
自定义Laravel (monolog)日志位置,并增加请求ID的实现
Oct 17 PHP
Thinkphp 框架扩展之类库扩展操作详解
Apr 23 PHP
Thinkphp 框架扩展之行为扩展原理与实现方法分析
Apr 23 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
数据库查询记录php 多行多列显示
2009/08/15 PHP
PHP实现的策略模式示例
2019/03/20 PHP
显示、隐藏密码
2006/07/01 Javascript
用JS实现的一个include函数
2007/07/21 Javascript
javascript抖动元素的小例子
2013/10/28 Javascript
jquery跟js初始化加载的多种方法及区别介绍
2014/04/02 Javascript
js截取中英文字符串、标点符号无乱码示例解读
2014/04/17 Javascript
在myeclipse中如何加入jquery代码提示功能
2014/06/03 Javascript
drag-and-drop实现图片浏览器预览
2015/08/06 Javascript
Vue.js中用v-bind绑定class的注意事项
2016/12/13 Javascript
vue之将echart封装为组件
2018/06/02 Javascript
vue如何安装使用Quill富文本编辑器
2018/09/21 Javascript
zepto.js 实时监听输入框的方法
2018/12/04 Javascript
javascriptvoid(0)含义以及与&quot;#&quot;的区别讲解
2019/01/19 Javascript
js module大战
2019/04/19 Javascript
Vue CLI3中使用compass normalize的方法
2019/05/30 Javascript
js获取 gif 的帧数的代码实例
2019/09/10 Javascript
解决三元运算符 报错“SyntaxError: can''t assign to conditional expression”
2020/02/12 Javascript
高性能web服务器框架Tornado简单实现restful接口及开发实例
2014/07/16 Python
python通过txt文件批量安装依赖包的实现步骤
2019/08/13 Python
Python学习笔记之列表和成员运算符及列表相关方法详解
2019/08/22 Python
Python 进程操作之进程间通过队列共享数据,队列Queue简单示例
2019/10/11 Python
2020最新pycharm汉化安装(python工程狮亲测有效)
2020/04/26 Python
Python中socket网络通信是干嘛的
2020/05/27 Python
俄罗斯最大的灯具网站:Fandeco
2020/03/14 全球购物
三月学雷锋月活动总结
2014/04/28 职场文书
员工评语范文
2014/12/31 职场文书
天下第一关导游词
2015/02/06 职场文书
具结保证书范本
2015/05/11 职场文书
2015年学校教务处工作总结
2015/05/11 职场文书
php远程请求CURL案例(爬虫、保存登录状态)
2021/04/01 PHP
python opencv通过按键采集图片源码
2021/05/20 Python
Python Django ORM连表正反操作技巧
2021/06/13 Python
Spring依赖注入多种类型数据的示例代码
2022/03/31 Java/Android
4种方法python批量修改替换列表中元素
2022/04/07 Python
Django数据库(SQlite)基本入门使用教程
2022/07/07 Python