<?php
class  CtbClass  { 
    var  $file;         
    var  $index;     
 
//建立一个文件并写入输入 
function  null_write($new) 
{ 
      $f=fopen($this->file,"w");         
      flock($f,LOCK_EX); 
      fputs($f,$new);         
      fclose($f);   
} 
//  添加数据记录到文件末端 
function  add_write($new)  {
 $f=fopen($this->file,"a");         
 flock($f,LOCK_EX); 
 fputs($f,$new);
 fclose($f);   
}   
//  配合readfile()的返回一起使用,把一行数据转换为一维数组 
function  make_array($line)  { 
 $array  =  explode("x0E",$line); 
 return  $array; 
} 
 
//把为一维数组转换一行数据 
function  join_array($line)  { 
 $array  =  join("x0E",$line); 
 return  $array; 
} 
//  返回数据文件的总行数 
function  getlines()  { 
 $f=file($this->file);         
 return  count($f);         
} 
//  返回下一行的数据记录(备用) 
function  next_line()  { 
 $this->index=$this->index++;         
 return  $this->get();         
} 
 
//  返回上一行的数据记录(备用) 
function  prev_line()  { 
 $this->index=$this->index--;         
 return  $this->get();         
}     
//  返回当前行的数据记录数据较小 
function  get()  { 
 $f=fopen($this->file,"r");         
 flock($f,LOCK_SH); 
 for($i=0;$i<=$this->index;$i++)  { 
  $rec=fgets($f,1024);         
 } 
 $line=explode("x0E",$rec); 
 fclose($f); 
 return  $line;         
}     
//  返回当前行的数据记录数据较大 
function  get_big_file()  { 
 $f=fopen($this->file,"r");         
 flock($f,LOCK_SH); 
 for($i=0;$i<=$this->index;$i++)  { 
  $rec=fgets($f,1024*5);         
 } 
 $line=explode("x0E",$rec); 
 fclose($f); 
 return  $line;         
}     
//  打开数据文件---以一维数组返回文件内容 
function  read_file()  { 
 if  (
file_exists($this->file))  { 
  $line  =file($this->file); 
 } 
 return  $line; 
} 
//  打开数据文件---以二维数组返回文件内容 
function  openFile()  { 
 if  (file_exists($this->file))  { 
  $f  =file($this->file); 
  $lines  =  array(); 
  foreach  ($f  as  $rawline)  { 
   $tmpline  =  explode("x0E",$rawline); 
   array_push($lines,  $tmpline); 
  } 
 } 
 return  $lines; 
} 
//  传入一个数组,合并成一行数据,重写整个文件 
function  overwrite($array){ 
 $newline  =  implode("x0E",$array);  
 $f  =  fopen($this->file,"w"); 
 flock($f,LOCK_EX); 
 fputs($f,$newline); 
 fclose($f); 
} 
    
//  添加一行数据记录到文件末端 
function  add_line($array,$check_n=1)  {     
 $s=implode("x0E",$array);         
 $f=fopen($this->file,"a");         
 flock($f,LOCK_EX); 
 fputs($f,$s);         
 if  ($check_n==1)  fputs($f,"n");         
 fclose($f);   
}         
 
//  插入一行数据记录到文件最前面 
function  insert_line($array)  { 
 $newfile  =  implode("x0E",$array); 
 $f  =  fopen($this->file,"r"); 
 flock($f,LOCK_SH); 
 while  ($line  =  fgets($f,1024))  { 
  $newfile  .=  $line; 
 } 
 fclose($f); 
 $f  =  fopen($this->file,"w"); 
 flock($f,LOCK_EX); 
 fputs($f,$newfile); 
 fclose($f); 
} 
 
//  更新所有符合条件的数据记录,适用于每行字节数据较大的情况 
function  update($column,$query_string,$update_array)  { 
 $update_string  =  implode("x0E",$update_array);       
 $newfile  =  "";  
 $fc=file($this->file); 
 $f=fopen($this->file,"r"); 
 flock($f,LOCK_SH); 
 for  ($i=0;$i<count($fc);$i++)  { 
  $list  =  explode("x0E",$fc[$i]); 
  if  ($list[$column]  !=  $query_string)  { 
   $newfile  =  $newfile.chop($fc[$i])."n"; 
  }  else  { 
   $newfile  =  $newfile.$update_string; 
  } 
 } 
 fclose($f); 
 $f=fopen($this->file,"w"); 
 flock($f,LOCK_EX); 
 fputs($f,$newfile); 
 fclose($f); 
} 
 
//  更新所有符合条件的数据记录,适用于每行字节数据较小的情况 
function  update2($column,$query_string,$update_array)  { 
 $newline  =  implode("x0E",$update_array);       
 $newfile  =  ""; 
 $f  =  fopen($this->file,"r"); 
 flock($f,LOCK_SH); 
 while  ($line  =  fgets($f,1024))  { 
  $tmpLine  =  explode("x0E",$line); 
  if  ($tmpLine[$column]  ==  $query_string)  { 
   $newfile  .=  $newline; 
  }  else  { 
   $newfile  .=  $line; 
  } 
 } 
 fclose($f); 
 $f  =  fopen($this->file,"w"); 
 flock($f,LOCK_EX); 
 fputs($f,$newfile); 
 fclose($f); 
} 
 
//  删除所有符合条件的数据记录,适用于每行字节数据较大的情况 
function  delete($column,$query_string)  { 
 $newfile  =  "";  
 $fc=file($this->file); 
 $f=fopen($this->file,"r"); 
 flock($f,LOCK_SH); 
 for  ($i=0;$i<count($fc);$i++)  { 
  $list  =  explode("x0E",$fc[$i]); 
  if  ($list[$column]  !=  $query_string)  { 
   $newfile  =  $newfile.chop($fc[$i])."n"; 
  } 
 } 
 fclose($f); 
 $f=fopen($this->file,"w"); 
 flock($f,LOCK_EX); 
 fputs($f,$newfile); 
 fclose($f); 
}         
 
//  删除所有符合条件的数据记录,适用于每行字节数据较小的情况 
function  delete2($column,$query_string){     
 $newfile  =  ""; 
 $f  =  fopen($this->file,"r"); 
 flock($f,LOCK_SH); 
 while  ($line  =  fgets($f,1024))  { 
  $tmpLine  =  explode("x0E",$line); 
  if  ($tmpLine[$column]  !=  $query_string)  { 
   $newfile  .=  $line; 
  } 
 } 
 fclose($f); 
 $f  =  fopen($this->file,"w"); 
 flock($f,LOCK_EX); 
 fputs($f,$newfile); 
 fclose($f); 
} 
 
       //取得一个文件里某个字段的最大值 
function  get_max_value($column)  { 
 $tlines  =  file($this->file); 
 for  ($i=0;$i<=count($tlines);$i++)  { 
  $line=explode("x0E",$tlines[$i]); 
  $get_value[]=$line[$column]; 
 } 
    $get_max_value  =  max($get_value); 
 return  $get_max_value; 
} 
 
 
//  根据数据文件的某个字段是否包含$query_string进行查询,以二维数组返回所有符合条件的数据 
function  select($column,  $query_string)  { 
 $tline  =  $this->openfile(); 
 $lines  =  array(); 
 foreach  ($tline  as  $line)  { 
  if  ($line[$column]  ==  $query_string)  { 
   array_push($lines,  $line); 
  } 
 } 
 
 return  $lines; 
} 
 
//  功能与function  select()一样,速度可能略有提升 
function  select2($column,  $query_string)  { 
 if  (file_exists($this->file))  { 
  $tline  =  $this->read_file(); 
  foreach  ($tline  as  $tmpLine)  { 
   $line  =  $this->make_array($tmpLine); 
   if  ($line[$column]  ==  $query_string)  { 
    $lines[]=$tmpLine; 
   } 
  } 
 } 
 
 return  $lines; 
} 
 
//  根据数据文件的某个字段是否包含$query_string进行查询,以一维数组返回第一个符合条件的数据 
function  select_line($column,  $query_string)  { 
 $tline  =  $this->read_file(); 
 foreach  ($tline  as  $tmpLine)  { 
  $line  =  $this->make_array($tmpLine); 
  if  ($line[$column]  ==  $query_string)  { 
      return  $line; 
   
break; 
  } 
 } 
} 
//  select  next/prev  line(next_prev  ==>  1/next,  2/prev)  by  cx 
function  select_next_prev_line($column,  $query_string,  $next_prev)  { 
 $tline  =  $this->read_file(); 
 $line_key_end  =  count($tline)  -  1; 
 $line_key  =  -1; 
 foreach  ($tline  as  $tmpLine)  { 
  $line_key++; 
  $line  =  $this->make_array($tmpLine); 
  if  ($next_prev  ==  1)  {    //  next? 
   if  ($line[$column]  ==  $query_string)  { 
    if  ($line_key  ==  0)  { 
     return  0; 
    }  else  { 
     $line_key_up  =  $line_key  -  1; 
     return  $up_line; 
    } 
   }  else  { 
    $up_line  =  $line; 
   } 
  }  elseif  ($next_prev  ==  2)  {    //  prev? 
   if  ($line[$column]  ==  $query_string)  { 
    if  ($line_key  ==  $line_key_end)  { 
     return  0; 
    }  else  { 
     $line_key_down  =  $line_key  +  1; 
     break; 
    } 
   } 
  }  else  { 
   return  0; 
  } 
 } 
 $down_line  =  $this->make_array($tline[$line_key_down]); 
 return  $down_line; 
} 
?>