使用PHP修改json而不保存/更新

时间:2018-01-11 14:05:31

标签: php json

我试图用php修改json文件中的数据。我正在使用的代码如下。它能够成功地准备文件内容,并且在foreach循环中它将在if语句中回显。

这很好,if语句现在是硬编码来测试的。我想要做的是修改各种属性并将其写回文件。这似乎不起作用。当我加载页面,然后刷新以查看是否设置了新值,它只是保持回显相同的值。我在本地下载.json,没有任何改变。

对我做错了什么的想法?

//Get file, decode
$filename = '../json/hartford.json';
$jsonString = file_get_contents($filename);
$data = json_decode($jsonString, true);

foreach ($data['features'] as $key => $segment) {

    if ($segment['properties']['UID'] == '25301') {

//echo out properties for testing
        echo("KEY: ".$key."<br/>");
        echo("UID: ".$segment['properties']['UID']."<br/>");
        echo("Full Name: ".$segment['properties']['FULLNAME']."<br/>");
        echo("FCC: ".$segment['properties']['FCC']."<br/>");
        echo("Render CL: ".$segment['properties']['RENDER_CL']."<br/>");
        echo("<hr/>");

 //set property to new value.... NOT WORKING?
        $segment['properties']['RENDER_CL'] = 111;
    }
}

//Test if file is writable to be sure
$writable = ( is_writable($filename) ) ? TRUE : chmod($filename, 0755);

if ( $writable ) {
    $newJsonString = json_encode($data);
    if (file_put_contents($filename, $newJsonString)) {
        echo('Put File Content success');
    } else {
        echo('NOT put');
    }
} else {
    echo 'not writeable';
}

最终它将回应“放置文件内容”的成功&#39;这似乎表明它是成功的,但它不是......感谢任何建议。

2 个答案:

答案 0 :(得分:5)

您需要了解foreach循环的工作原理。问题是,您获得的值($segment)是源数组中实际值的副本。因此,当您分配给它($segment['properties']['RENDER_CL'] = 111;)时,您并没有真正更改源数组。当cycel-loop结束时,你只能更改一些超出范围的局部变量。

有几种方法可以解决这个问题。其中之一是在值变量之前添加&

foreach ($data['features'] as $key => &$segment)

这告诉它使用数组项的引用,而不是复制它的值。

答案 1 :(得分:2)

您应该在foreach中使用$ segment变量作为参考:

foreach ($data['features'] as $key => &$segment) {

    ...

    $segment['properties']['RENDER_CL'] = 111;
}