合并并覆盖json文件,其中id';s匹配,在PHP中


merge and overwrite json file where id's match, in PHP

我需要合并json文件,并在id匹配时进行覆盖,但这不是覆盖。我的PHP是这样的:

foreach($instagram_array['data'] as $key => $image){
    $id = $image['id'];
    $url    = $image['images']['standard_resolution']['url'];
    $date_shot = date('M d, Y', $image['created_time']);
    $likes = $image['likes']['count'];    
$values[id] = array(
    'id' => $id,
    'url' => $url,
    'likes' => $likes,
    'date_shot' => $date_shot,
    $tags = implode(', ', $image['tags']);
);
    };
    $user_array = array_merge($values, $user_array);
    file_put_contents('myfile.json', json_encode($user_array, JSON_FORCE_OBJECT));

生成的JSON如下所示:

{
123_456: {
  id: "123_456",
  url: "photo1.jpg",
  likes: 22,
  date_shot: "Feb 20, 2015",
  tags: "tag1, tag2, tag3"
  },
123_457: {
  id: "123_457",
  url: "//photo2.jpg",
  likes: 20,
  date_shot: "Feb 20, 2015",
  tags: "tag1, tag5"
},...

我希望它使用[$id]作为键,并在匹配时覆盖整个子数组,但没有。。。它确实像我希望的那样不断地向文件中添加越来越多的文件,并且根据需要避免重复记录,但它不会更新现有记录。

您需要像这样交换array_merge中的参数:

$user_array = array_merge($user_array, $values);

我认为array_merge文档的这一部分应该对您有所帮助:

如果输入数组具有相同的字符串键,则后面的值因为该键将覆盖上一个。但是,如果数组包含数字键,以后的值不会覆盖原始值值,但将被追加。

你有数字键。因此,您可以手动合并它或使您的密钥字符串。

此外,如果您只需要替换元素,而不需要附加元素,则应查看array_replacement函数