我有一个包含大约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“。(我最终会得到两个id为2的条目)。
发布于 2019-02-08 04:17:45
如果您使用array_column通过id索引已解码的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);发布于 2019-02-08 04:12:37
如果你只是想总是更新第二个条目,你可以这样做:
$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;
}
}发布于 2019-02-08 04:18:09
这就是了:
$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);Sandbox
输出
Array
(
[0] => Array
(
[id] => 1
[name] => somename
[callsign] => somesign
[rank] => somerank
[region] => somereligon
[status] => somestatus
[dept] => BCSO
)
....完成,
https://stackoverflow.com/questions/54581456
复制相似问题