2013-01-18 30 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)來減少內存佔用。 –