I have a serialized array of values 开发者_StackOverflowsaved to a file and need to change the value of one of the variables. In the example I change the value of $two and then save the whole array back into the file with the new value.
Is there a more efficient way of altering just the single value with out having to read and write the entire file/array.
$data = file_get_contents('./userInfo');
$data = unserialize($data);
extract($data);
$two="this is a altered value";
$userData = array(
'one' => $one,
'two' => $two,
'three' => $three
);
$file=fopen("../userInfo",'w');
fwrite($file, $userData);
fclose($file);
You don't need to use extract()
rebuild $userData
like that - just access the array key you need. Also, you can save a few steps by using file_put_contents()
This function is identical to calling fopen(), fwrite() and fclose() successively to write data to a file.
New code:
$filePath = './userInfo';
$data = unserialize( file_get_contents( $filePath ) );
$data['two'] = "this is a altered value";
file_put_contents( $filePath, serialize( $data ) );
Option 1: database row for each array entry.
Option 2: different file for each array entry, using file name instead of array key. Basically use a directory in the file system as a very simple database.
Option 3: fixed sized entries in flat file, so you can multiply the array index by the block size for read and write. You would have to truncate data bigger than your chosen block size. Basically use the single file as a very simple database.
If you're willing to do manual string parsing, then you only need to rewrite the remainder of the file contents that occur after the value, assuming you change the length of the string. If you don't change the length of the string, you can edit in place. Unless this file of serialized data is very large though, I really doubt you will do anything but make it slower.
I wouldn't bother though. If this is causing a performance issue for you, I would seriously consider a different storage format.
精彩评论