0

我正在尝试写入 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
4

3 回答 3

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 */ }
于 2013-03-08T15:54:56.090 回答
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()for 键来保持较低。

于 2013-03-08T15:55:18.433 回答
0

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

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

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

于 2013-03-08T16:15:32.843 回答