我正在尝试通过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
答案 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,而不是副本。这样你就可以直接操作它。