php 无限级缓存的类的扩展

  

复制代码 代码如下:

  <?php

  /**

  * 功能: 根据条件建立分类缓存减少类别使用

  * 创建日期:Thu May 31 15:55:11 CST 2007

  * 最后更新:

  * 作者: sanshi <[email protected]>

  */

  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 <[email protected]>

  */

  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;

  }

  }

  ?>