【发布时间】:2018-04-05 14:00:54
【问题描述】:
我正在尝试使用 PHP 表单来更新 JSON 文件,但是当我编辑文件的字段时,它会创建条目的副本,但包含更新的信息。例如:
[
{"toolName":"tool1", "url":"https://google.com/", "phase":"None"},
{"toolName":"tool2", "url":"http://yahoo.com/", "phase":"None"},
{"toolName":"tool3", "url":"http://bing.com/", "phase":"None"}
]
如果 PHP 表单在提交时想要更改“tool1”的“阶段”,它会添加一个带有更新的新条目。喜欢:
[
{"toolName":"tool1", "url":"https://google.com/", "phase":"None"},
{"toolName":"tool2", "url":"http://yahoo.com/", "phase":"None"},
{"toolName":"tool3", "url":"http://bing.com/", "phase":"None"},
{"toolName":"tool1", "url":"https://google.com/", "phase":"NewPhase"}
]
如何避免这种情况?我在更新时使用数组中工具的索引作为标识符,所以我目前的解决方案是这样的:
$toolId = $_POST['tool-id'];
$toolName = $_POST['tool-name'];
$toolUrl = $_POST['tool-url'];
$toolPhase = $_POST['tool-phase'];
$data = file_get_contents("../assets/js/tools.json");
$json_data = json_decode($data, true);
$json_data[$toolId]->toolName = $toolName;
$json_data[$toolId]->url = $toolUrl;
$json_data[$toolId]->phase = $toolPhase;
$json_data = array_values($json_data);
file_put_contents("../assets/js/tools.json", stripslashes(json_encode($json_data)));
**注意:提交表单时,我使用的是Bootstrap modal,所以我只发送当前可见工具(即索引“toolId”处的工具)的数据,所以我不会遍历整个JSON 文件。
【问题讨论】:
-
您需要将其存储为关联数组,并以
$toolId为键。当您执行array_values($json_data)时,您会丢失密钥。 -
$_POST['tool-id']应该包含0这是tool1的索引确保没有额外的噪音添加到该值 -
也不要在 json 编码值上
stripslashes。json_encode知道如何生成有效的 json 并且剥离斜线可能会破坏它 -
感谢您的帮助!
标签: php arrays json forms duplicates