php 无限级缓存的类的扩展 |
本文标签: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(); //附加的属性,需要字段名与数据里的名对应 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; } } ?> |