私は、単一の文字列で構成され、非常に大きなファイルを持っています。そのため、ファイルのサイズを、私はメモリに文字列全体を読みたくありません。
最後の文字は常に閉じ括弧になります]
。この文字列が、JSON配列であるとして。私はすぐにその閉じ括弧の前に(文字列として表される)小さなJSONオブジェクトを挿入します。私はいくつかのアイデアを見てきましたが、仕事には何も得ることができません。
あなたが見ることができるように、私は、ファイルを開こうとして使用していますfseek
ちょうど目の前ににファイルポインタを移動すること]
。それから私はその位置で既存の文字列に新しい文字列を記述してみてください。
しかし、この効果は、私が欲しいものではありません、既存の文字列の末尾に新しい文字列を追加するだけです。
簡単な例として、のファイルは、この文字列を含むアウトを開始するとしましょう:
[{"name":"alice","city":"london"}]
そして私はこのコードを使用して、このリストに二人目を追加したいです:
$new_person = ",{\"name\":\"bob\",\"city\":\"paris\"}";
$filename = "people.json";
$fh = fopen($filename, "a+");
$filesize = filesize($filename);
$stat = fstat($fh);
fseek($fh, $stat[$filesize]-1);
fwrite($fh, $new_person);
fclose($fh);
しかし、私はして羽目になることは、この文字列を含むファイルです。
[{"name":"alice","city":"london"}],{"name":"bob","city":"paris"}
私のPHPのスキルがひどいです。私の場合、私は言うことができないfseek
ISは、間違った場所や、問題が別の場所にある場合に向いて。任意の助けてくれてありがとう。
以下からのドキュメント(強調鉱山):
a+
:読み取りおよび書き込み用にオープン。ファイルの末尾にファイルポインタを置きます。ファイルが存在しない場合は、それを作成しようとします。このモードでは、fseek関数は、()のみの書き込みは、常に追加され、読取位置に影響を与えます。
使用r+
代わりモード、および代わりにfstat
あなたが行うことができます。
fseek($fh, -1, SEEK_END);