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

时间:2019-02-07 20:07:07

标签: php json

我有一个约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的条目)。

3 个答案:

答案 0 :(得分:2)

如果您用idarray_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);

Sandbox

输出

Array
(
[0] => Array
    (
        [id] => 1
        [name] => somename
        [callsign] => somesign
        [rank] => somerank
        [region] => somereligon
        [status] => somestatus
        [dept] => BCSO
    )
    ....

完成