2017-09-15 2 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" 
     } 
    } 
] 

は基本的に私が何をしたいのphpファイルをヒットするAJAX機能を呼び出すボタンをクリックの上にあります。次に、渡された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

ここに '$ temp [] = $ tempArray;'新しいコンテンツを追加しています。 – Jeff

+0

あなたは[reference](http://php.net/manual/en/language.references.pass.php)でforeachしたいと思います。この方法で、配列全体を歩き回り、変更したい値を変更することができます。 – Jeff

答えて

3

あなたのforeachで$eby referenceを渡したい:あなたは別の配列を必要としないと戻ってあなたのJSONファイルに$tempを保存することができ

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

この方法です。

短い説明(ひび割れ、私を修正してください):あなたはそれを書き戻す必要がありますので、あなたのforeach PHPの
は、$ eのコピーを作る - あなたは試したとして。
参照渡しすると、コピーではなく元のアイテム$ eを処理します。この方法で、直接操作することができます。

+0

うわー、私は "参照によって"知らなかった。完璧に働いた。ありがとうございました!今日のレッスン:-) – Sergio

+0

よろしくお願いします! – Jeff

+1

それは素晴らしい機能ですが、注意深く使用してください。特に関数/メソッドを書くとき。あなたは何が変わるかも知れないところで機能を持つことを望んでいません。 – Jeff

関連する問題