Php, используя unserialize () и serialize (), изменяя значения в сохраненном файле - PullRequest
3 голосов
/ 22 апреля 2010

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

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

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

Ответы [ 3 ]

8 голосов
/ 22 апреля 2010

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

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

Новый код:

$filePath = './userInfo';

$data = unserialize( file_get_contents( $filePath ) );

$data['two'] = "this is a altered value";

file_put_contents( $filePath, serialize( $data ) );
1 голос
/ 22 апреля 2010

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

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

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

0 голосов
/ 22 апреля 2010

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...