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 无限级缓存的类的扩展
声明:登载此文出于传递更多信息之目的,并不意味着赞同其观点或证实其描述。
Reply on: @reply_date@
@reply_contents@