I just finished writing a flat-file DB class for PHP which supports selecting, updating, inserting and deleting. 

I was wondering if there are any ways to make it faster or if I'm doing anything the wrong way

here's my source code

    <?php
	class FlatDB {
		private static $field_deliemeter = "\t";
		private static $linebreak = "\n";
		private static $table_extension = '.tsv';
		
		public $table_name;
		public $table_contents = array("FIELDS" => NULL, "RECORDS" => NULL);
		
		/*
		** This method creates a table
		** 
		** @param	string	$table_name
		**
		** @example
		** $db = new FlatDB;
		** $db->createTable('Administrators');
		**/
		public function createTable($table_name, $table_fields) {			
			// Create the file
			$tbl_name = $table_name.self::$table_extension;
			$header = '';
			foreach($table_fields as $field) {
				$header .= $field.self::$field_deliemeter;
			}
			file_put_contents($tbl_name, $header);
			
		}
		
		/*
		** This method opens a table for querying, editing, etc
		** 
		** @param	string	$table_name
		**
		** @example
		** $db = new FlatDB;
		** $db->openTable('Test.csv');
		**/	
		public function openTable($table_name) {		
			// Check if this table is found
			$table_name = $table_name.self::$table_extension;
			if(file_exists($table_name) === FALSE) throw new Exception('Table not found.');

			// Set the table in a property
			$this->table_name = $table_name;
			
			// Get the fields
			$table = file($this->table_name, FILE_IGNORE_NEW_LINES); 
			$table_fields = explode(self::$field_deliemeter, $table[0]);
			unset($table[0]);
			
			// Put all records in an array
			$records = array();
			$num = 0;
			foreach($table as $record) {
				$records_temp = explode(self::$field_deliemeter, $record);
				$count = count($records_temp);
				for($i = 0; $i < $count; $i++) 
					$records[$num][$table_fields[$i]] = $records_temp[$i];
				$num++;
			}
			
			$this->table_contents['FIELDS'] = $table_fields;
			$this->table_contents['RECORDS'] = $records;
		}
		
		/*
		** This method returns fields selected by the user based on a where criteria
		** 
		** @param	array	$select	an array containing the fields the user wants to select, if he wants all fields he should use a *
		** @param	array	$where	an array which has field => value combinations
		** @return	array	it returns an array containing the records
		**
		** @example
		** $db = new FlatDB;
		** $db->openTable('Test.csv');
		** $select = array("id", "name", "group_id");
		** $where = array("group_id" => 2);
		** $db->getRecords($select, $where);
		**/
		public function getRecords($select, $where = array()) {
			// Do some checks
			if(is_array($select) === FALSE) throw new Exception('First argument must be an array');
			if(is_array($where) === FALSE && isset($where)) throw new Exception('Second arguement must be an array');
			if(empty($this->table_name) === TRUE) throw new Exception('There is no connection to a table opened.');
			
			// If the array contains only one key which is a *, then select all fields
			if($select[0] == '*') $select = $this->table_contents['FIELDS'];
			
			// Check if the fieldnames in select are all found
			foreach($select as $field_name)
				if(in_array($field_name, $this->table_contents['FIELDS']) === FALSE) throw new Exception($field_name." is not found in the table.");
			
			// Check if the fieldnames in where are all found
			foreach($where as $field_name => $value)
				if(in_array($field_name, $this->table_contents['FIELDS']) === FALSE) throw new Exception($field['name']." is not found in the table.");
			
			// Find the record that the user queried in where
			$user_records = $this->table_contents['RECORDS'];
			if(isset($where)) {
				foreach($where as $field => $value) {
					foreach($this->table_contents['RECORDS'] as $key => $record) {
						if($record[$field] != $value) {
							unset($user_records[$key]);
						}
					}
				}
			}
			
			// Preserve only the keys that the user asked for
			$final_array = array();
			$temp_fields = array_flip($select);
			foreach($user_records as &$record) {
				$final_array[] = array_intersect_key($record, $temp_fields);
			}
			
			return $final_array;
		}
		
		/*
		** This method updates fields based on a criteria
		** 
		** @param	array	$update	an array containing the fields the user wants to update
		** @param	array	$where	an array which has field => value combinations which is the criteria
		**
		** @example
		** $db = new FlatDB;
		** $db->openTable('Test.csv');
		** $update = array("group_id" => 1);
		** $where = array("group_id" => 2);
		** $db->updateRecords($update, $where);
		**/
		public function updateRecords($update, $where) {
			// Check if the connection is opened
			if(empty($this->table_name) === TRUE) throw new Exception('There is no connection to a table opened.');
			
			// Check if each field in update and where are found
			foreach($update as $field => $value) 
				if(in_array($field, $this->table_contents['FIELDS']) === FALSE) throw new Exception($field." is not found.");
				
			foreach($where as $field => $value)
				if(in_array($field, $this->table_contents['FIELDS']) === FALSE) throw new Exception($field." is not found.");
				
			// Find the record that the user queried in where
			$user_records = $this->table_contents['RECORDS'];
			$preserved_records = array();
			foreach($where as $field => $value) {
				foreach($this->table_contents['RECORDS'] as $key => $record) {
					if($record[$field] != $value) {
						unset($user_records[$key]);
						$preserved_records[$key] = $record;
					}
				}
			}
			
			// Update whatever needs updating
			$user_records_temp = $user_records;
			foreach($user_records_temp as $key => $record) {
				foreach($update as $field => $value) {
					$user_records[$key][$field] = $value;
				}
			}
			
			// Merge the preserved records and the records that were updated, then sort them by their record number
			$user_records += $preserved_records;
			ksort($user_records, SORT_NUMERIC);

			// Modify the property of the records and insert the new table
			$this->table_contents['RECORDS'] = $user_records;

			// Implode it so we can save it in a file
			$final_array[] = implode(self::$field_deliemeter, $this->table_contents['FIELDS']);
			foreach($user_records as $record)
				$final_array[] = implode(self::$field_deliemeter, $record);
			
			// Implode by linebreaks
			$data = implode(self::$linebreak, $final_array);
			
			// Save the file
			file_put_contents($this->table_name, $data);
		}
		
		/*
		** This method inserts a new record to the table
		** 
		** @param	array	$insert an array containing field => value combinations
		** @param	array	$where	an array which has field => value combinations which is the criteria
		**
		** @example
		** $db = new FlatDB;
		** $db->openTable('Test.csv');
		** $array = array("id" => 7, "name" => "Jack", "password" => "1234567", "group_id" => 2);
		** $db->insertRecord($array);
		**/
		public function insertRecord($insert) {
			if(is_array($insert) === FALSE) throw new Exception('The values need to be in an array');
			if(empty($this->table_name) === TRUE) throw new Exception('You need to open a connection to a table first.');
			
			// Check if each field in insert is found
			foreach($insert as $field => $value) 
				if(in_array($field, $this->table_contents['FIELDS']) === FALSE) throw new Exception($field." is not found.");
			
			// Build the new record
			$newRecord = array();
			foreach($this->table_contents['FIELDS'] as $field) {
				if(isset($insert[$field])) $newRecord[$field] = $insert[$field]; 
				else $newRecord[$field] = NULL;
			}
						
			// Add the new record to the pre-existing table and save it in the records
			$records = $this->table_contents['RECORDS'];
			$records[] = $newRecord;
			$this->table_contents['RECORDS'] = $records;
			
			// Format it for saving
			$data = array();
			$data[] = implode(self::$field_deliemeter, $this->table_contents['FIELDS']);
			
			foreach($records as $record)
				$data[] = implode(self::$field_deliemeter, $record);
			
			// Implode by linebreaks
			$data = implode(self::$linebreak, $data);
			
			// Save in file
			file_put_contents($this->table_name, $data);
			
		}
		
		/*
		** This method deletes records from a table
		** 
		** @param	array	$where	an array which has field => value combinations which is the criteria
		**
		** @example
		** $db = new FlatDB;
		** $db->openTable('Test.csv');
		** $where = array("group_id" => 3);
		** $db->deleteRecords($where);
		**/
		public function deleteRecords($where) {
			if(is_array($where) === FALSE) throw new Exception('The argument must be an array');
			if(empty($this->table_name) === TRUE) throw new Exception('You need to open a connection to a database first.');
			
			// Check if each field in insert is found
			foreach($where as $field => $value) 
				if(in_array($field, $this->table_contents['FIELDS']) === FALSE) throw new Exception($field." is not found.");

			// Find the records that match and delete them
			$records = $this->table_contents['RECORDS'];
			foreach($records as $key => $record) {
				foreach($where as $field => $value) {
					if($record[$field] == $value) unset($records[$key]);
				}
			}
			
			// Save the records in the property
			$this->table_contents['RECORDS'] = $records;
			
			// Format it for saving
			$data = array();
			$data[] = implode(self::$field_deliemeter, $this->table_contents['FIELDS']);
			
			foreach($records as $record)
				$data[] = implode(self::$field_deliemeter, $record);
			
			// Implode by linebreaks
			$data = implode(self::$linebreak, $data);			
			
			// Save the file
			file_put_contents($this->table_name, $data);
		}
		
	}


    ?>