<?php class Text { var $file; var $index; // 建立一个文件并写入输入 function null_write($new) { $f = fopen ( $this->file, "w" ); flock ( $f, LOCK_EX ); fputs ( $f, $new ); fclose ( $f ); } function read() { return file_get_contents ( $this->file ); } // 添加数据记录到文件末端 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; } }