【问题标题】:How to update (overwrite) a json file using php如何使用 php 更新(覆盖)json 文件
【发布时间】:2013-01-18 06:44:48
【问题描述】:
[
  {
     "id"  : 1,
    "name"  : "levin",
    "description" : "some desc",
    "size"  : "100KG",
     "actions" : {
                 "walking" : true,
                  "eating" : true
                  }
  },
  {
    "id"  : 2,
    "name"  : "clara",
    "description" : "some desc",
    "size"  : "2000KG",
     "actions" : {
                 "walking" : false,
                  "eating" : true
                  }

  }
]

这是我的 person.json 文件。我喜欢更新(覆盖)现有值。我没有找到任何有用的问题。

我有一个名字“levin”,我喜欢将其覆盖为空或“---”。但它应该只基于“id”。以下是我的 php 代码,但它不起作用:(

public function api_put()
    {
         //print($this->put('id')); am getting here 2 value from other page 
        //print($this->put('action'));.

        if($this->put('action') == "remove"){
            $file = json_decode(file_get_contents("assets/json/person.json"));
            $new_val = array();
            $i = 0 ;
            foreach ($file as $key => $value) {
                if((string)$value->id == $this->put('id')) {
                    $data[] = (string)$value->name="--";(string)$value->description="--";
                    $new_val[$i] =  $data;
                    $i++;
                }

            }
            file_put_contents('assets/json/person.json', json_encode($new_val));
            $message = array('id' => $this->put('id'), 'message' => 'Successfully updated!!');

            $this->response($message, 200); 
        }
    }

如何根据特定的 id 覆盖 json 值并且不更改所有其他 id 数据。我正在使用 codeigniter REST api。提前谢谢

【问题讨论】:

  • 把文件改成php然后用while循环把数据填满
  • 你的代码不工作是什么意思?你得到了什么输出,你的预期输出是什么?
  • 我喜欢使用 php 覆盖现有的 json 值
  • [["--"]] 这是我的输出:(

标签: php json codeigniter


【解决方案1】:

几件事。

  1. 您不需要$new_val 数组,您可以在适当的位置编辑这些资源。
  2. PHP 是weakly typed,所以不需要(string)$value->id == $this->put('id')。 PHP 引擎将为您完成此转换。
  3. 在等号左侧进行强制转换没有任何作用。 (string)$value->description="--";该声明无效。
  4. 这是一种糟糕的形式,在任何编程语言中...(string)$value->name="--";(string)$value->description="--"; 执行两个操作的两个语句应该在两个不同的行上。
  5. 一般概念,您的代码应该易于阅读。把它放开一点,让它呼吸。多年后当你回到你的代码时,你会很高兴你这样做了。

public function api_put()
{
    if ($this->put('action') == 'remove')
    {
        $file = json_decode(file_get_contents('assets/json/person.json'));

        foreach ($file as $key => $value)
        {
            if ($value->id == $this->put('id'))
            {
                $value->name = '--';
                $value->description = '--';
            }
        }

        file_put_contents('assets/json/person.json', json_encode($file));

        $message = array('id' => $this->put('id'), 'message' => 'Successfully updated!!');

        $this->response($message, 200);
    }
}

这样,不是更好吗?

【讨论】:

  • 对较大数组的一个小优化,您应该在 foreach 循环的 if 语句中使用 break 语句。这将阻止它不必要地迭代数组的其余部分。在 PHP 5.5 中,您还可以考虑使用 Generators 来减少内存占用,如果您担心的话。
【解决方案2】:

我认为你必须像这样循环存储所有细节

foreach ($file as $key => $value) {
    if((string)$value->id == $this->put('id')) {
        $value->name="--";(string)$value->description="--";
    }
        $new_val[$i] =  $value;
    $i++;

}

【讨论】:

  • 他为什么不能等到迭代器得到他想要修改的ID,然后更新适当的值,然后保存呢?为什么需要一个新的值数组?
  • 是的,@MarkTomlin 我们也可以在没有新数组的情况下做到这一点
  • 我也不知道他为什么要转换成字符串......在这种情况下它应该没有任何效果。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-03-18
  • 1970-01-01
  • 2013-05-11
  • 1970-01-01
  • 2012-11-12
  • 2019-12-03
相关资源
最近更新 更多