【问题标题】:How to update a json file with only new elements?如何仅使用新元素更新 json 文件?
【发布时间】:2014-09-05 23:30:13
【问题描述】:

我从另一个页面收到一个包含许多元素的 json,其中一个是 id。我想要做的是创建一个只有 id 的新 json,所以这就是我正在做的事情:

首先,json 被解码以作为文件存储在服务器中。它存储在一个数组中。从那里我将所有 id 存储在另一个数组中,这是我正在做的简化版本:

$json_array = json_decode(file_get_contents('path/to/file.json'));
foreach($json_array as $arr){
$ids[] = $arr['id'];
}

file_put_contents('ids.json', json_encode($ids));

到目前为止,它正在做我想做的事,我得到了一个包含所有 id 的 json。问题是,我的 json 文件更新并且只显示最后 50 项。所以每当调用它时,我都会得到最后的 50 个 id。例如,如果我有 50 个项目,那么我的 json 有 id 1 到 id 50,但是如果我有 60 个项目,它会显示从 id 10 到 id 60,所以前 10 个 id 被替换并消失了。

我想保留前 10 个 ID,但仍会使用新 ID 进行更新并避免重复。问题是,在我给出的示例中,项目 10 到 50 是相同的,只有最后 10 个是新的。我不确定这是否可能。说清楚:

我当前的 json: id 从 1 到 50。

更新json:第10-60项(10-50项与之前相同)。

我希望我的 json 保留的内容: id 从 1 到 60,没有重复。 (每次有更新时保持这个,所以如果 json 有 100 - 150 个项目,我的 ids json 将存储 1 到 150 的 ids。

为了更清楚,我以数字为例,它并没有真正更新 10 个新项目,它可以是任何随机数。哦,我正在使用 Codeigniter,如果有帮助的话。

感谢您的帮助和时间,我到处搜索解决方案,但我不确定要寻找什么。

【问题讨论】:

  • 您是否尝试在 json_last_error() 中遇到任何错误?如果确实存在错误,也许会对您有所帮助。
  • 对不起,我不明白这有什么帮助?该代码正在运行,问题是它正在用新项目替换旧项目。不应该这样做吗?
  • 我不确定您的代码是否正常工作 :) 请参阅 foreach($json_array as $arr){ $ids[] = $arr['id'] } $ids[] = $arr['id'] 之后缺少 ;
  • 哦!对不起,这是一个错字,这不是我的实际代码,它只是一个简化版本,以使事情更清楚:)
  • mhh,也许您应该发布整个代码,但是,请尝试在json_decodejson_encode 之后放置一个var_dump(json_last_error());

标签: php json codeigniter


【解决方案1】:

您需要读入目标文件,解码其内容,检查数组是否包含新项目,如果不包含,则将其附加到数组中。

$ids = json_decode(file_get_contents('ids.json'));
$json_array = json_decode(file_get_contents('path/to/file.json'));
foreach($json_array as $arr){
    if (!in_array($arr['id'], $ids)) $ids[] = $arr['id'];
}

file_put_contents('ids.json', json_encode($ids));

【讨论】:

  • 这很聪明!我还应该将 FILE_APPEND 作为第三个参数添加到 file_put_contents() 吗?
  • 在这种情况下不是,不是。您正在阅读整个文件,因此您已经有效地追加了。如果您这样做FILE_APPEND,它将只是无效的 JSON 或大量重复。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-06-22
  • 2014-08-26
  • 1970-01-01
  • 2021-03-30
  • 1970-01-01
  • 2012-10-19
  • 1970-01-01
相关资源
最近更新 更多