2016-12-24 52 views
0

我期待獲得一些關於如何使模塊化代碼執行PHP parse_ini_file並使用返回的值運行JSON解碼的輸入。使用PHP解析INI文件並運行JSON_DECODE

我有一個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; 
} 

?> 

我很想得到一些其他意見,因爲我不知道該從哪裏出發。

我已經看過了這些其他堆棧溢出的問題,但我不知道如何讓所有的東西都合在一起。

+0

使用可變的變量,比如$$ key'很少是個好主意,因爲你不知道他們可能沒有通過'$ bacnetini'鍵再次循環被稱爲....何不乾脆建數組? –

+0

謝謝馬克。我怎樣才能使用數組呢?你能詳細解釋一下嗎? –

+0

在循環之前將數組定義爲空數組('$ bacnetData = [];');使用'$ bacnetData [$ key] = $ json_data;'而不是'$$ key = $ json_data;''填充該數組;'';並使用'<?php echo $ bacnetData ['SEA_SRV_SEA_SV1_01_EXHT']「;」>? –

回答

0

爲什麼不試試這樣的,而不是什麼東西?這將允許您在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']); 

?> 
+0

這個工作,但它返回API的所有JSON數據 –

+0

有沒有一種方法來返回「現值」字段JSON數據? –

+0

明白了,我只是將「現值」索引添加到轉儲中,如下所示:var_dump($ data ['SEA_SRV_SEA_SV1_01_EXHT'] ['present-value']);' –