2013-01-18 27 views
-1
[ 
    { 
    "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文件。我喜欢更新(覆盖)现有的值。没有发现任何有关此问题的有用问题。如何使用php更新(覆盖)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数据。我用笨REST API。在此先感谢

+1

将文件更改为php,然后使用while循环来填充数据 – Afsar

+0

你是什么意思你的代码不工作?你得到了什么输出,以及你的预期输出是什么? –

+0

我喜欢用php –

回答

1

我想你一定需要循环这样的存储所有细节

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

} 
+0

)为什么他不能等到迭代器到达他想修改的ID,然后更新然后保存?为什么需要一个新的数值数组? –

+0

雅肯定@MarkTomlin我们可以做到不用新阵列 – senK

+1

我也不知道他为什么要投射字符串......它不应该在这种情况下有任何影响 –

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

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

在那里,是不是好多了?

+0

这是非常有帮助的。 –

+0

对较大数组的一个小优化,您应该在foreach循环中的if语句中使用break语句。这会阻止它不必要地遍历数组的其余部分。在PHP 5.5中,如果你担心这个问题,你也可以考虑使用[Generators](https://wiki.php.net/rfc/generators)来减少内存占用。 –