如果字段匹配PHP,则覆盖JSON


Overwrite JSON if fields match PHP

我试图写一个json文件,并希望能够覆盖一个对象,如果某些字段匹配。现在,我的代码可以获取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

您可以使用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 */ }

假设我理解正确,您只需要根据消息检查$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()作为键来保持低内存消耗。

如果您使用json_decode($string, true),您将得到一个关联数组或数字数组。这个数组可以用标准的php数组方法来操作。

$array = json_decode($string, true);
if(md5($data['message']) != md5($newMessage)) {
    $array['message'] = $newMessage; 
}

我使用md5,因为我不知道消息的结构