【发布时间】:2016-12-24 19:07:42
【问题描述】:
我希望获得一些关于如何制作执行 PHP parse_ini_file 然后使用返回值运行 JSON 解码的模块化代码的信息。
我有一个 BACnet API,它返回自动化系统中 BACnet 点的 JSON 结构。我编写了以下代码来解码 JSON 数据以仅返回“当前值”字段,然后在网页上显示该值。
<?php
$url = "http://hostname.lcl:47800/api/v1/bacnet/devices/10100/objects/0.0";
$json = file_get_contents($url);
$json_data = json_decode($json, true);
echo "<b>Room temperature</b>: ". $json_data["present-value"]. " DEG F";
;?>
这很好用,但我想让这段代码模块化,以便它可以用于许多其他方面。
我创建了一个 INI 文件,其中包含其他点的列表以及包含来自 API 的 JSON 数据的 URL。
## BACnet Configuration File
# BACnet Object URLs from WACNET Browser API
[bacnet]
SEA_RMT = http://hostname.lcl:47800/api/v1/bacnet/devices/10100/objects/0.0
SEA_SRV_SEA_SV1_01_EXHT = http://hostname.lcl:47800/api/v1/bacnet/devices/10100/objects/0.3
SEA_SRV_SEA_SV1_02_EXHT = http://hostname.lcl:47800/api/v1/bacnet/devices/10100/objects/0.4
SEA_SRV_SEA_SV1_03_EXHT = http://hostname.lcl:47800/api/v1/bacnet/devices/10100/objects/0.5
我想做的是使用 INI 文件来获取列表中每个点的当前值,然后创建一个变量作为点的名称并将其设置为等于“当前值”字段.然后我可以像这样在 HTML 页面上使用 PHP 变量来引用该点:
<?php echo "$SEA_SRV_SEA_SV1_01_EXHT";?>
我从下面的代码开始,但它不起作用。
<?php
// Parse the settings file
$bacnetini = parse_ini_file('/var/www/config/bacnet.ini');
// Parse the keys to variables and add data
foreach ($bacnetini as $key => $value) {
$url = $value;
$json = file_get_contents($url);
$json_data = json_decode($json, true);
$$key = $json_data;
}
?>
我很想就完成此任务的最佳方式获得一些其他意见,因为我真的不知道从这里去哪里。
我已经查看了这些其他 Stack Overflow 问题,但我不知道如何将各个部分组合在一起。
【问题讨论】:
-
使用像
$$key这样的变量变量很少是一个好主意,因为如果不再次循环$bacnetini的键,你不知道它们可能会被调用什么......为什么不简单地构建一个数组? -
谢谢马克。我怎么能使用数组呢?你能详细说明一下吗?
-
在循环之前将数组定义为空数组 (
$bacnetData = [];);使用$bacnetData[$key] = $json_data;而不是$$key = $json_data;填充该数组;并使用<?php echo $bacnetData['SEA_SRV_SEA_SV1_01_EXHT']";?>显示