Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/256.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用PHP修改json而不保存/更新_Php_Json - Fatal编程技术网

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

使用PHP修改json而不保存/更新,php,json,Php,Json,我试图用php修改json文件中的数据。下面是我正在使用的代码。它能够成功地准备好文件内容,并且在foreach循环中,它将在if语句中回显 这很好,if语句现在已经硬编码以进行测试。我要做的是修改各种属性并将其写回文件。这似乎不起作用。当我加载页面,然后刷新以查看是否设置了新值时,它只是不断重复相同的值。我在本地下载了.json,没有任何变化 有没有想过我做错了什么 //Get file, decode $filename = '../json/hartford.json'; $jsonStr

我试图用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';
}
//获取文件,解码
$filename='../json/hartford.json';
$jsonString=file\u get\u contents($filename);
$data=json_decode($jsonString,true);
foreach($data['features']作为$key=>$segment){
如果($segment['properties']['UID']=='25301'){
//用于测试的回显属性
回音(“键:.$KEY.”
); echo(“UID:.$segment['properties']['UID'].”
); echo(“全名:.$segment['properties']['FULLNAME'].”
); echo(“FCC:.$segment['properties']['FCC'].”
); echo(“渲染CL:.$segment['properties']['Render_CL'].”
); 回声(
); //将属性设置为新值…不工作? $segment['properties']['RENDER_CL']=111; } } //测试文件是否可写以确保 $writeable=(是否可写($filename))?TRUE:chmod($filename,0755); 如果($可写){ $newJsonString=json_encode($data); if(文件内容($filename,$newJsonString)){ echo('Put File Content success'); }否则{ 回声(‘不放’); } }否则{ 回声“不可写”; }

最后,它将呼应出“输出文件内容成功”,这似乎表明它是成功的,但它不是。。。谢谢你的建议

您需要了解foreach循环是如何工作的。问题是,您得到的值(
$segment
)是源数组中真实值的副本。因此,当您分配给它(
$segment['properties']['RENDER_CL']=111;
)时,您实际上不会更改源数组。当cycel循环结束时,只更改超出范围的局部变量

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

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

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

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

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

    ...

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

那么,是save操作失败了,还是值的更改失败了?我假设值的更改与if($writeable)语句中的一样,我成功地将文件内容放入。有道理吗?为什么要假设?测试。您可以在将$data写入文件之前回显它的内容,并查看它是否包含修改后的值。FWIW我认为当您写入$segment时,您是在修改变量的临时副本,而不是对$data中的内容的引用。非常感谢@Martin。这很有效,我非常感谢你的解释。