从PHP fseek()/rewind()写入JSON文件不起作用

从PHP fseek()/rewind()写入JSON文件不起作用,php,json,Php,Json,我正在处理一个logger类,正在添加的JSON具有以下格式 {"log_owner" : "test123","log_message" : "Has logged in","log_timestamp" : "1397921556","log_type" : "1"} 要检索它,我需要将所有不同的JSON对象用方括号括起来,如下所示: [ {"log_owner" : "test456","log_message" : "Has logged in","log_timestamp"

我正在处理一个logger类,正在添加的
JSON
具有以下格式

{"log_owner" : "test123","log_message" : "Has logged in","log_timestamp" : "1397921556","log_type" : "1"}
要检索它,我需要将所有不同的
JSON
对象用方括号括起来,如下所示:

[
    {"log_owner" : "test456","log_message" : "Has logged in","log_timestamp" : "1397921856","log_type" : "2"}
    {"log_owner" : "test123","log_message" : "Has logged in","log_timestamp" : "1397921556","log_type" : "1"}
]
我已设法在文件不存在时将其插入文件的开头,但主要问题在于在添加新对象时将右括号移到文件的末尾,在覆盖最后一个括号之前,我已尝试将文件指针移动两处。继续将结束括号添加到每个新条目中,我尝试通过以下方式完成此操作:

if(!$content_new) {
$pos=ftell($handle);
fseek($handle,$pos-2);
}
fwrite($handle, $content);
fclose($handle);
但是似乎不适用于
.json
文件
,因为我无法将文件指针移动到任何其他行或倒带它

我怎样才能做到这一点?我们高度赞赏任何形式的改进指导或建议

谢谢。

直接解决您的问题-快速且肮脏。
要使多行部分成为有效的JSON,还需要在行的末尾添加逗号(数组中最后一行除外)。您需要将整个文件作为一个JSON数组,有什么特别的原因吗?我正在使用jQuery动态检索内容,并对整个数组应用不同属性的搜索过滤器。按原样存储日志行并使用快速PHP脚本将文件输出为JSON可能会更容易,而不是在每次添加一行时对文件进行修改。嗯,是的,的确如此。我设法通过获取内容、从完整内容字符串中删除然后再次写入来实现这一点,它不可伸缩,一个错误就会把一切都搞糟,所以我想我将切换到按原样存储。我建议不要尝试将它们存储为“json”格式,使用一些您可以轻松解析的东西。将它们转换为“json”,然后再转换为需要它们的例程。PHP在“json”方面做得并不好。这是“古怪的”。谢谢你的指导!
<?php
function writeLog($path, $newLine) 
{
    $exists = file_exists($path);
    $handle = fopen($path, 'c');
    if (!$exists) {
        // first write to log file
        $line = "[" . PHP_EOL . $newLine . PHP_EOL . "]";
    } else {
        // file exists so it has one or more logged lines
        $line = "," . PHP_EOL . $newLine . PHP_EOL . "]";
        fseek($handle , -(strlen(PHP_EOL) + 1) , SEEK_END);
    }
    fwrite($handle, $line);
    fclose($handle);
}
$path = __DIR__ . '/file.json';
// delete file if exists - for tests
if (file_exists($path)) {
    unlink($path);
}
$line = '{"log_owner" : "test123","log_message" : "Has logged in","log_timestamp" : "1397921556","log_type" : "1"}';
for ($i = 0; $i < 10; $i++) {
    writeLog($path, $line);
}
<?php
function writeLogCSV($path, $newLine) 
{
    $handle = fopen($path, 'a');
    fputcsv($handle, $newLine);
    fclose($handle);
}

function readLogCsv ($path) 
{
    $handle = fopen($path, 'r');
    $rows = [];
    while (false !== ($line = fgetcsv($handle))) {
        $rows[] = array_combine(
            ["log_owner", "log_message", "log_timestamp", "log_type"],
            $line
        );
    }
    fclose($handle);
    echo json_encode($rows);
}
$path = __DIR__ . '/file.csv';
// delete file if exists - for tests
if (file_exists($path)) {
    unlink($path);
}
$line = ["test123", "Has logged in", "1397921556", "1"];
for ($i = 0; $i < 10; $i++) {
    writeLogCSV($path, $line);
}
readLogCsv($path);