2017-09-15 69 views
0

我想通過php更新JSON文件,但當前代碼正在做的是追加新對象而不是替換它。下面是JSON的一個片段:通過PHP更新JSON文件

[ 
    { 
     "id": 3, 
     "title": "SOME MODS", 
     "date": "Aug\/Sept 2017", 
     "done": "yes", 
     "files changed": { 
      "1": "index.html", 
      "2": "style.css" 
     }, 
     "backend changes\/additions": { 
      "1": "added some stuff" 
     }, 
     "additions": { 
      "1": "logo.jpg" 
     } 
    } 
] 

基本上就是我想要做的是點擊按鈕調用AJAX功能打一個PHP文件。然後檢查通過的ID是否與來自JSON文件的ID匹配,然後更新「完成」屬性...如果沒有,則是,如果是,則將其設爲否。

這裏是我的PHP代碼:

if (isset($_POST['comp'])) { 
    $newObj = $_POST['comp']; 

    $jsonFile = file_get_contents('data.json'); 
    $temp = json_decode($jsonFile, true); 

    $tempArray; 

    foreach($temp as $e){ 
     if($e['id'] == $newObj) { 
     if ($e['done'] === 'no'){ 
      $e['done'] = 'yes'; 
      $tempArray = $e; 
     } else { 
      $e['done'] = 'no'; 
      $tempArray = $e; 
     } 
     } 
    } 

    $temp[] = $tempArray; 
    $final_data = json_encode($temp, JSON_PRETTY_PRINT); 
    file_put_contents('data.json', $final_data); 

    print_r($temp); 

但正如我所提到的,因爲它代表所有它做的是插入一個新的對象,而不是取代的。我需要更改什麼才能使此功能起作用?

謝謝大家。

-S

+0

$ temp []附加到$ temp。去掉 []。 – endrju

+0

here'$ temp [] = $ tempArray;'你正在添加新的內容。 – Jeff

+0

我想你想通過[reference](http://php.net/manual/en/language.references.pass.php)進行foreach。通過這種方式,您可以遍歷數組並更改要更改的值。 – Jeff

回答

3

你想傳遞$eby reference在你的foreach:

<?php 
// this originally comes from file 
$json = <<<EOT 
    [ 
    { 
     "id": 3, 
     "title": "SOME MODS", 
     "date": "Aug\/Sept 2017", 
     "done": "yes", 
     "files changed": { 
      "1": "index.html", 
      "2": "style.css" 
     }, 
     "backend changes\/additions": { 
      "1": "added some stuff" 
     }, 
     "additions": { 
      "1": "logo.jpg" 
     } 
    } 
] 
EOT; 

$temp = json_decode($json, true); 
$newObj=3; // this is only here for testing 

     // here's the trick: the & before $e 
foreach($temp as &$e){ 
    if($e['id'] == $newObj) { 
    if ($e['done'] === 'no'){ 
     $e['done'] = 'yes'; 
    } else { 
     $e['done'] = 'no'; 
    } 
    } 
} 
$final_data = json_encode($temp, JSON_PRETTY_PRINT); 
file_put_contents('data.json', $final_data); 

這樣,你不需要另一個陣列,可以節省$temp回你的JSON文件。

簡短的說明(裂紋,請指正):
在你的foreach PHP使得$ E的副本,所以你必須把它寫回 - 因爲你已經試過。
當您通過引用傳遞它時,您將處理原始項目$ e,而不是副本。這樣你可以直接操縱它。

+0

哇,我從來不知道「通過參考」。完美工作。謝謝!我今天的課程:-) – Sergio

+0

不客氣! – Jeff

+1

這是一個很棒的功能,但仔細使用它。特別是在編寫函數/方法時。你不希望有一個功能,你不知道它會改變什麼。 – Jeff