【问题标题】:Overwrite JSON if fields match PHP如果字段匹配 PHP,则覆盖 JSON
【发布时间】:2013-03-08 15:45:26
【问题描述】:

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

【问题讨论】:

    标签: php json file


    【解决方案1】:

    您可以使用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 数组。
    • 如此大量的数据会使这种方法陷入困境。有没有办法让它更快?
    • @hexblot 现在我遇到了解析错误。在第一行说Parse error: syntax error, unexpected ')', expecting '{'$datum... 似乎没有错,但这就是我得到的
    • @copilot0910 抱歉,我有一个额外的括号
    • @ExplosionPills 现在,我收到了一个Parse error: syntax error, unexpected T_IF 这是我的代码的链接。我不知道我做错了什么。非常感谢您迄今为止的帮助以及即将到来的帮助。 pastebin.com/idCuYM3j
    【解决方案2】:

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

    【讨论】:

    • 为确保我理解,通过使用$message 作为键,我正在检查是否已经存在重复项,如果存在,是否会被覆盖?
    【解决方案3】:

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

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

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

    【讨论】:

      猜你喜欢
      • 2022-10-17
      • 2014-01-03
      • 2020-06-06
      • 1970-01-01
      • 2020-02-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多