如何使用php更新(覆盖)json文件

时间:2013-01-18 06:44:49

标签: php json codeigniter

[
  {
     "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); 
        }
    }

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

2 个答案:

答案 0 :(得分:3)

有几件事。

  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. 一般概念,您的代码应易于阅读。将它放出一点点,让它呼吸。当你多年后回到你的代码时,你会很高兴你做到了。

  6. 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);
        }
    }
    

    那里,还不是那么好吗?

答案 1 :(得分:1)

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

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

}