【问题标题】:Use PHP to parse INI file and run JSON_DECODE使用 PHP 解析 INI 文件并运行 JSON_DECODE
【发布时间】: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; 填充该数组;并使用&lt;?php echo $bacnetData['SEA_SRV_SEA_SV1_01_EXHT']";?&gt; 显示

标签: php json


【解决方案1】:

为什么不尝试这样的事情呢?这将允许您在 INI 文件中创建不会影响脚本的其他部分。

<?php

$bacnetini = parse_ini_file('/var/www/config/bacnet.ini', true);

$data = array();

foreach ($bacnetini['bacnet'] as $key => $url) {
    $data[$key] = json_decode(file_get_contents($url), true);
}

var_dump($data['SEA_SRV_SEA_SV1_01_EXHT']);

?>

【讨论】:

  • 这可行,但它会从 API 返回所有 JSON 数据。
  • 有没有办法只从 JSON 数据中返回“现值”字段?
  • 知道了,我刚刚将“现值”索引添加到转储中,如下所示:var_dump($data['SEA_SRV_SEA_SV1_01_EXHT']['present-value']);
猜你喜欢
  • 2011-03-15
  • 2016-04-21
  • 2015-10-13
  • 2016-02-07
  • 2014-09-03
  • 2012-11-18
  • 1970-01-01
  • 2011-10-24
  • 1970-01-01
相关资源
最近更新 更多