通过PHP更新JSON文件

时间:2017-09-15 21:01:31

标签: php json ajax

我正在尝试通过php更新JSON文件,但当前代码正在做的是附加新对象而不是替换它。这是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匹配,然后更新“done”属性...如果没有,则为yes,如果是,则将其设为no。

这是我的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 );

但正如我所提到的那样,它所做的一切就是插入一个新的Object而不是替换。我需要更改什么才能使此功能正常工作?

谢谢大家。

-S

1 个答案:

答案 0 :(得分:3)

您希望在您的foreach中传递$e by reference

<?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,而不是副本。这样你就可以直接操作它。