from CTB
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
1<count($fc);$i++) !="$query_string)" $f="fopen($this-" $list='explode("\x0E",$fc[$i]);' $newfile="$newfile.$update_string;" ($list[$column]="" else="" fclose($f);="" if="" {="" }="">file,"w");
2flock($f,LOCK_EX);
3fputs($f,$newfile);
4fclose($f);
5}
6
7// 更新所有符合条件的数据记录,适用于每行字节数据较小的情况
8function update2($column,$query_string,$update_array) {
9$newline = implode("\x0E",$update_array);
10$newfile = "";
11$f = fopen($this->file,"r");
12flock($f,LOCK_SH);
13while ($line = fgets($f,1024)) {
14$tmpLine = explode("\x0E",$line);
15if ($tmpLine[$column] == $query_string) {
16$newfile .= $newline;
17} else {
18$newfile .= $line;
19}
20}
21fclose($f);
22$f = fopen($this->file,"w");
23flock($f,LOCK_EX);
24fputs($f,$newfile);
25fclose($f);
26}
27
28// 删除所有符合条件的数据记录,适用于每行字节数据较大的情况
29function delete($column,$query_string) {
30$newfile = "";
31$fc=file($this->file);
32$f=fopen($this->file,"r");
33flock($f,LOCK_SH);
34for ($i=0;$i<count($fc);$i++) !="$query_string)" $f="fopen($this-" $list='explode("\x0E",$fc[$i]);' $newfile='$newfile.chop($fc[$i])."\n";' ($list[$column]="" fclose($f);="" if="" {="" }="">file,"w");
35flock($f,LOCK_EX);
36fputs($f,$newfile);
37fclose($f);
38}
39
40// 删除所有符合条件的数据记录,适用于每行字节数据较小的情况
41function delete2($column,$query_string){
42$newfile = "";
43$f = fopen($this->file,"r");
44flock($f,LOCK_SH);
45while ($line = fgets($f,1024)) {
46$tmpLine = explode("\x0E",$line);
47if ($tmpLine[$column] != $query_string) {
48$newfile .= $line;
49}
50}
51fclose($f);
52$f = fopen($this->file,"w");
53flock($f,LOCK_EX);
54fputs($f,$newfile);
55fclose($f);
56}
57
58//取得一个文件里某个字段的最大值
59function get_max_value($column) {
60$tlines = file($this->file);
61for ($i=0;$i<=count($tlines);$i++) {
62$line=explode("\x0E",$tlines[$i]);
63$get_value[]=$line[$column];
64}
65$get_max_value = max($get_value);
66return $get_max_value;
67}
68
69
70// 根据数据文件的某个字段是否包含$query_string进行查询,以二维数组返回所有符合条件的数据
71function select($column, $query_string) {
72$tline = $this->openfile();
73$lines = array();
74foreach ($tline as $line) {
75if ($line[$column] == $query_string) {
76array_push($lines, $line);
77}
78}
79
80return $lines;
81}
82
83// 功能与function select()一样,速度可能略有提升
84function select2($column, $query_string) {
85if (file_exists($this->file)) {
86$tline = $this->read_file();
87foreach ($tline as $tmpLine) {
88$line = $this->make_array($tmpLine);
89if ($line[$column] == $query_string) {
90$lines[]=$tmpLine;
91}
92}
93}
94
95return $lines;
96}
97
98// 根据数据文件的某个字段是否包含$query_string进行查询,以一维数组返回第一个符合条件的数据
99function select_line($column, $query_string) {
100$tline = $this->read_file();
101foreach ($tline as $tmpLine) {
102$line = $this->make_array($tmpLine);
103if ($line[$column] == $query_string) {
104return $line;
105break;
106}
107}
108}
109// select next/prev line(next_prev ==> 1/next, 2/prev) by cx
110function select_next_prev_line($column, $query_string, $next_prev) {
111$tline = $this->read_file();
112$line_key_end = count($tline) - 1;
113$line_key = -1;
114foreach ($tline as $tmpLine) {
115$line_key++;
116$line = $this->make_array($tmpLine);
117if ($next_prev == 1) { // next?
118if ($line[$column] == $query_string) {
119if ($line_key == 0) {
120return 0;
121} else {
122$line_key_up = $line_key - 1;
123return $up_line;
124}
125} else {
126$up_line = $line;
127}
128} elseif ($next_prev == 2) { // prev?
129if ($line[$column] == $query_string) {
130if ($line_key == $line_key_end) {
131return 0;
132} else {
133$line_key_down = $line_key + 1;
134break;
135}
136}
137} else {
138return 0;
139}
140}
141$down_line = $this->make_array($tline[$line_key_down]);
142return $down_line;
143}
144
145
146
147}</count($fc);$i++)></count($fc);$i++)>