我有一个约35个条目的json文件。我需要能够根据表单输入来更新特定键中的值。因此,如果我只想编辑“ id”:“ 2”中的信息。
来自我的file.json的示例
[
{
"id": "1",
"name": "Bob Smith",
"callsign": "500",
"rank": "Sheriff",
"region": "NA",
"status": "Active",
"dept": "BCSO"
},
{
"id": "2",
"name": "Steve Rogers",
"callsign": "537",
"rank": "Under Sheriff",
"region": "NA",
"status": "Active",
"dept": "BCSO"
},
{
"id": "3",
"name": "Jane Smith",
"callsign": "505",
"rank": "Captain",
"region": "NA",
"status": "Active",
"dept": "BCSO"
}
]
这是我使用的代码:
$rlog = array();
$RosterFile = "./includes/roster.json";
$jsondata = file_get_contents($RosterFile);
$rlog = json_decode($jsondata, true);
$num = count($rlog);
$formdata = array(
'id'=>$id,
'name'=>$name,
'callsign'=>$sign,
'rank'=>$rank,
'region'=>$region,
'status'=>$status,
'dept'=>$dept
);
array_push($rlog, $formdata);
$jsondata = json_encode($rlog, JSON_PRETTY_PRINT);
if (file_put_contents($RosterFile, $jsondata))
{ echo '<h3>Roster changes Updated</h3>'; }
else { echo "error"; }
这实际上可以在json的末尾添加一个新条目,而不是更新“ 2”。 (我最终将获得2个ID为2的条目)。
答案 0 :(得分:2)
如果您用id
用array_column
为解码的JSON编制索引,并用id
构建替换项,则可以轻松进行替换。然后重新索引以获得更漂亮的JSON:
$rlog = array_column(json_decode($jsondata, true), null, 'id');
$formdata[$id] = array(
'id'=>$id,
'name'=>$name,
'callsign'=>$sign,
'rank'=>$rank,
'region'=>$region,
'status'=>$status,
'dept'=>$dept
);
$rlog = array_values(array_replace($rlog, $formdata));
或者只需将正确的替换为id
:
$rlog = array_column(json_decode($jsondata, true), null, 'id');
$formdata = array(
'id'=>$id,
'name'=>$name,
'callsign'=>$sign,
'rank'=>$rank,
'region'=>$region,
'status'=>$status,
'dept'=>$dept
);
$rlog[$id] = $formdata;
但是实际上,您应该能够修改原始文件:
$rlog = array_column(json_decode($jsondata, true), null, 'id');
$rlog[$id] = array(
'id'=>$id,
'name'=>$name,
'callsign'=>$sign,
'rank'=>$rank,
'region'=>$region,
'status'=>$status,
'dept'=>$dept
);
$rlog = array_values($rlog);
答案 1 :(得分:1)
如果您只想更新第二个条目,总是可以这样做:
$rlog[1] = $formdata;
代替您的array_push
行。
我还将告诉您,您正在从数据中读取内容,然后对其进行更改,然后使用新内容更新文件。如果另一个进程在读和写之间更改了文件,则新数据将丢失。
如果要使用它的功能:
function update_array_element(array $input, int $index, $newData) {
$input[$index] = $newData;
}
注意:类型提示仅在php版本> = 7中可用
或者使其更加灵活:
function update_array_element(array $elements, int $id, $newData) {
for($i=0; $i<count($elements); $i++) {
if ($elements[$i]['id'] == $id) $elements[$i] = $newData;
}
}
答案 2 :(得分:0)
您在这里:
$id = 1;
$formdata = array(
'id'=>$id,
'name'=>'somename',
'callsign'=>'somesign',
'rank'=>'somerank',
'region'=>'somereligon',
'status'=>'somestatus',
// 'dept'=>$dept - omitted intentionally
);
$rlog = json_decode($jsondata, true);
//note the & pass by refrence
foreach($rlog as $key=>&$value) if($value['id'] == $formdata['id']) $value = array_replace($value, $formdata);
print_r($rlog);
输出
Array
(
[0] => Array
(
[id] => 1
[name] => somename
[callsign] => somesign
[rank] => somerank
[region] => somereligon
[status] => somestatus
[dept] => BCSO
)
....
完成