2010-04-21 2 views
2

У меня есть сериализованный массив значений, сохраненных в файле, и вам нужно изменить значение одной из переменных. В этом примере я изменяю значение $ 2, а затем сохраняю весь массив обратно в файл с новым значением.Php, используя unserialize() и serialize(), изменяя значения в сохраненном файле

Есть ли более эффективный способ изменения только одного значения без необходимости читать и записывать весь файл/массив.

$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); 
+0

* (родственный) * http://stackoverflow.com/questions/2237291/php-reading-file/2237315#2237315 – Gordon

ответ

1

Вариант 1: строка базы данных для каждой записи массива.

Вариант 2: отдельный файл для каждой записи массива, используя имя файла вместо ключа массива. В основном используйте каталог в файловой системе как очень простую базу данных.

Вариант 3: фиксированные размеры в плоском файле, поэтому вы можете умножить индекс массива на размер блока для чтения и записи. Вам придется обрезать данные, превышающие размер выбранного вами блока. В основном использовать один файл как очень простую базу данных.

+0

Вариант 1 отсутствует. Это была моя попытка не использовать базу данных, которую она иногда убивала. Вариант 2 - достойная идея, но может стать беспорядочной. Вариант 3 на самом деле интересная идея, которую я, возможно, должен попробовать. – Prospero

6

Вам не нужно использовать extract() восстановить $userData подобное - просто получить доступ к ключу массива вам нужно. Кроме того, вы можете сохранить несколько шагов с помощью file_put_contents()

Эта функция идентична вызову FOPEN(), FWRITE() и fclose() последовательно записывать данные в файл.

Новый код:

+0

Спасибо, что было идеально. – Prospero

+0

Я оглянулся на это, и это сделало мой код более легким для чтения, который всегда хорош, но это тот же код, что и в моем вопросе. – Prospero

+0

Зависит от того, как вы определяете «тот же». Я показал вам, как упростить изменение одного значения. Что еще вы ищете? –

0

Если вы готовы делать вручную строку синтаксический, то вам нужно всего лишь переписать оставшуюся часть содержимого файла, которые происходят после того, как значения, если вы изменить длину строки. Если вы не измените длину строки, вы можете редактировать ее на месте. Если этот файл сериализованных данных очень большой, хотя, я действительно сомневаюсь, что вы сделаете что-нибудь, но сделаете это медленнее.

Я бы не стал беспокоиться. Если это вызывает проблемы с производительностью, я бы серьезно подумал о другом формате хранения.

Смежные вопросы