Chinaunix首页 | 论坛 | 博客
  • 博客访问: 18680167
  • 博文数量: 7460
  • 博客积分: 10434
  • 博客等级: 上将
  • 技术积分: 78178
  • 用 户 组: 普通用户
  • 注册时间: 2008-03-02 22:54
文章分类

全部博文(7460)

文章存档

2011年(1)

2009年(669)

2008年(6790)

分类:

2008-04-15 17:54:36

近日给自己的站做了个在线统计,用存储数据。写了下面这个类,

[php]

xml_fetch_array(); * * echo "

";                                                                                                               *
* print_r($data);                                                                                                                                                        * 
*                                                                                                                                                                                 *
******************************************************************************************/
class xml 
{
	var $dbase;       //数据库,要读取的XML文件
	var $dbname;      //数据库名称,顶层元素,与文件名称一致
	var $dbtable;     //数据表,要取得的节点
	var $parser;      //剖析器	
	var $vals;        //属性
	var $index;       //索引
	var $dbtable_array;//节点数组
	var $array;        //下级节点的数组
	var $result;       //返回的结果
	var $querys;      

	function xml($dbase,$dbtable)
	{
		$this->dbase=$dbase;
		$this->dbname=substr($dbase,strrpos($dbase,"/")+1,-4);
		$this->dbtable=$dbtable;
		$data=$this->ReadXml($this->dbase);
		if(!$data){
			die("无法读取 $this->dbname.xml");
		}
        $this->parser = xml_parser_create();
        xml_parser_set_option($this->parser,XML_OPTION_CASE_FOLDING,0);
		xml_parser_set_option($this->parser,XML_OPTION_SKIP_WHITE,1);
        xml_parse_into_struct($this->parser,$data,$this->vals,$this->index);		
		xml_parser_free($this->parser);
		//遍历索引,筛选出要取值的节点 节点名dbtable
		foreach ($this->index as $key=>$val) {
			if ($key == $this->dbtable) {
				//取得节点数组
				$this->dbtable_array = $val;	
			} else {
				continue;
			}
		}
		for ($i=0; $i < count($this->dbtable_array); $i+=2) {
			$offset = $this->dbtable_array[$i] + 1;					
			$len    = $this->dbtable_array[$i + 1] - $offset;
			//array_slice() 返回根据 offset 和 length 参数所指定的 array 数组中的一段序列。
			//所取节点下级数组
			$value=array_slice($this->vals,$offset,$len);
			//取得有效数组,合并为结果数组
			$this->array[]=$this->parseEFF($value);
		}
		return true;
	}
	//将XML文件读入并返回字符串
	function ReadXml($file)
	{
		return file_get_contents($file);
	}    
	//取得有效数组
	function parseEFF($effective) {
		for ($i=0; $i < count($effective); $i++){
			$effect[$effective[$i]["tag"]] = $effective[$i]["value"];
		}
		return $effect;
	}
	//xml_query(,条件,多条件时逻辑运算符and or or,插入或更新的数组)
	function xml_query($method,$condition,$if='and',$array=array())
	{
		if(($method=='select')||($method=='count')){
			return $this->xml_select($method,$condition,$if);
		} elseif($method=='insert') {
			return $this->xml_insert($condition,$if,$array);
		} elseif($method=='update') {
			return $this->xml_update($condition,$if,$array);
		}
	}
	//取得xml数组
    function xml_fetch_array($condition,$if)
    { 
		//$this->querys++;
		$row = $this->array;	//初始化数据数组
		if($condition) {
			//是否有条件,如有条件则生成符合条件的数组
			//生成条件数组,条件格式 field,operator,match
			$condition=explode(",",$condition);//条件数组
			$cs=count($condition)/3;           //条件数
			for($i=0;$i<$cs;$i++){
				$conditions[]=array("field"=>$condition[$i*3],"operator"=>$condition[$i*3+1],"match"=>$condition[$i*3+2]);
			}
			//echo count($row);
			for($r=0;$r$match)){
						$true++;//若条件符合,符合数加1
					} elseif(($operator=='>')&&($row[$r][$field]>=$match)){
						$true++;//若条件符合,符合数加1
					}					
				}				
				//根据条件取值
				if($if=='and'){
					//如果多条件为and,当符合数等于条件数时,生成数组
					if($true==$cs){
						$result[]=$row[$r];
					}
				} else {
					//如果多条件为or,当有符合纪录时,生成数组
					if($true!=0){
						$result[]=$row[$r];
					}
				}
				//echo $true;
				//echo "
";
				//print_r($true);
				$true=0;//符合条件数归零,进入下一轮循环
			}
		} else {
			$result=$this->array;
		}	
		//echo "
";
		//print_r($this->result);
		return $result;
    }
	//筛选或统计
	function xml_select($method,$condition,$if)
	{
		$result=$this->xml_fetch_array($condition,$if);
		if($method=='select'){
			return $result;
		} else {
			return count($result);
		}
		
	}
	//插入数据
	function xml_insert($condition,$if,$array)
	{
		$data=$this->xml_fetch_array($condition,$if);//总数据数组
		$data[]=$array;                              //插入后的总数据数组
		$this->array=$data;                          //更新总数组
		$this->WriteXml($data);
	}

    //得到更新的XML并改写
	function xml_update($condition,$if,$array)
	{
		$datas=$this->array;                              //总数据数组
		$subtract=$this->xml_fetch_array($condition,$if);//要更新的数组
		//echo "
";
		//print_r($data);
		//print_r($datas);
		//echo "每条记录中有".count($datas[0])."个值
"; for($i=0;$i"; foreach($data as $k=>$v){ //echo "-第".$i."条的".$k."值为".$v."
"; //echo "--要查找的数组".$k."值为".$subtract[0][$k]."
"; if($v==$subtract[0][$k]){ $is++; } } if($is==count($data)){ //echo "----与第".$i."条符合
"; $datas[$i]=$array; //array_splice($datas,$i,$i+1); } //echo "原始记录中的第".$i."条与要查找的有".$is."匹配
"; //echo "原始记录中的第".$i."条结束
"; $is=0; } //array_splice($datas,2,2+1,$array); //echo "
";
		//print_r($datas);
		$this->array=$datas;
		$this->WriteXml($datas);
		
	}
	//写入XML文件(全部写入)
	function WriteXml($array)
	{
		if(!is_writeable($this->dbase)){
			die("无法写入".$this->dbname.".xml");
		}
		$xml.="\r\n";
		$xml.="<$this->dbname>\r\n";
		for($i=0;$i$s){
				$xml.="<$k>$s\r\n";
			}
			$xml.="dbtable>\r\n";
		}
		$xml.="dbname>";
		$fp=@fopen($this->dbase,"w");
		flock($fp, LOCK_EX);
		rewind($fp);		
		fputs($fp,$xml);
		fclose($fp);
	}
	//逐行写入xml(我试着写入10000行,感觉没一次写入快,所以没用这种写入方式)
	function WriteLine($array)
	{
		if(!is_writeable($this->dbase)){
			die("无法写入".$this->dbname.".xml");
		}
		$fp=@fopen($this->dbase,"w");
		rewind($fp);
		flock($fp, LOCK_EX);
		fputs($fp,"\r\n");
		fputs($fp,"<$this->dbname>\r\n");
		for($i=0;$idbtable>\r\n");
			$xml.="<$this->dbtable>\r\n";
			foreach($array[$i] as $k=>$s){
				fputs($fp,"<$k>$s\r\n");
			}
			fputs($fp,"dbtable>\r\n");
		}
		fputs($fp,"dbname>");
		fclose($fp);
	}
}
?> 
[/php]
阅读(456) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~