我正在尝试写入json文件,并且希望能够在某些字段匹配时覆盖对象。现在,我的代码可以获取当前在JSON文件中的内容,但这只是将最新的对象添加到它的末尾。我需要做的是,如果消息字段匹配,那么我需要用新的条目替换该条目。知道我的意思吗?
感谢您的帮助!
PHP:
$file = file_get_contents('test.json');
$data = json_decode($file);
unset($file);//prevent memory leaks for large json.
//insert data here
$data[] = array("message" => $name, "latitude" => $lat, "longitude" => $lon, "it" => $it);
//save the file
file_put_contents('test.json',json_encode($data));
echo json_encode($data);
unset($data);//release memory
答案 0 :(得分:0)
您可以使用array_filter
查找具有匹配名称的元素并将其更新到位。但是,这不会删除任何现有的重复项。
$datum = array_filter($data, function (&$elem) use ($name, $lat, $lon, $it) {
if ($elem['message'] === $name) {
$elem = array('message' => $name /* snip */)
return true;
}
});
if (!$datum) { /* append array */ }
答案 1 :(得分:0)
假设我理解正确,您只需根据消息检查$data
数组中的两个元素是否相等。最简单的方法是使用数据数组的键,然后重置它。所以类似于:
$file = file_get_contents('test.json');
$data = json_decode($file);
unset($file);//prevent memory leaks for large json.
//insert data here
$data[$message] = array("message" => $name, "latitude" => $lat, "longitude" => $lon, "it" => $it);
//save the file
$data = array_values($data);
file_put_contents('test.json',json_encode($data));
echo json_encode($data);
unset($data);//release memory
这会增加内存消耗,因此您可以使用md5()
代替密钥以保持低位。
答案 2 :(得分:0)
如果使用json_decode($ string,true),您将获得关联或数字数组。可以使用标准的php数组方法操作此数组。
$array = json_decode($string, true);
if(md5($data['message']) != md5($newMessage)) {
$array['message'] = $newMessage;
}
我使用的是md5,因为我不知道消息的结构如何。