首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >尝试用php替换单个键中的数据

尝试用php替换单个键中的数据
EN

Stack Overflow用户
提问于 2019-02-08 04:07:07
回答 3查看 41关注 0票数 0

我有一个包含大约35个条目的json文件。我需要能够根据表单输入更新特定键中的值。因此,如果我只想编辑“id”中的信息:“2”。

来自我的file.json的示例

代码语言:javascript
复制
    [
    {
        "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"
    }
    ]

下面是我使用的代码:

代码语言:javascript
复制
$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的条目)。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2019-02-08 04:17:45

如果您使用array_column通过id索引已解码的JSON,并使用id构建您的替换,那么您可以很容易地进行替换。然后重新索引以获得更漂亮的JSON:

代码语言:javascript
复制
$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

代码语言:javascript
复制
$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;

但实际上,您应该能够只修改原始的:

代码语言:javascript
复制
$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);
票数 2
EN

Stack Overflow用户

发布于 2019-02-08 04:12:37

如果你只是想总是更新第二个条目,你可以这样做:

代码语言:javascript
复制
$rlog[1] = $formdata;

而不是你的array_push线路。

我还将告诉您,您正在从数据中读取内容,然后更改它,然后使用新内容更新文件。如果另一个进程在您的读取和写入之间更改了文件,则新数据将丢失。

如果你想让它成为一个函数:

代码语言:javascript
复制
function update_array_element(array $input, int $index, $newData) {
    $input[$index] = $newData;
}

注意:类型提示仅在php版本>=7中可用。

或者让它更灵活:

代码语言:javascript
复制
function update_array_element(array $elements, int $id, $newData) {
    for($i=0; $i<count($elements); $i++) {
        if ($elements[$i]['id'] == $id) $elements[$i] = $newData;
    }
}
票数 1
EN

Stack Overflow用户

发布于 2019-02-08 04:18:09

这就是了:

代码语言:javascript
复制
$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

输出

代码语言:javascript
复制
Array
(
[0] => Array
    (
        [id] => 1
        [name] => somename
        [callsign] => somesign
        [rank] => somerank
        [region] => somereligon
        [status] => somestatus
        [dept] => BCSO
    )
    ....

完成,

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54581456

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档