2014-09-30 91 views
4

我得到了一個我需要解析的JSON文件。我正在爲一家酒店做一些工作,最終目標是建立一個列表:使用PHP解析JSON文件

Room Number 
Adult Content (enabled or disabled) 
Room Charges (enabled or disabled) 
Status (occupied or unoccupied) 

JSON文件,我無法控制。它給了我,從那裏我必須創建上面提到的佈局。

這是我給出的JSON文件的示例(它是文件中的一部分,但你會明白它來自這個樣本是如何工作的):

{ 
    "apiVersion" : "0.1", 
    "data" : { 
     "roomCount" : 105, 
     "rooms" : [ 
     { 
      "room_number" : "104", 
      "services" : [ 
       { 
        "adult" : { 
        "enabled" : true 
        }, 
        "room_charges" : { 
        "enabled" : true 
        } 
       } 
      ], 
      "status" : "OCCUPIED" 
     }, 
     { 
      "room_number" : "105", 
      "services" : [ 
       { 
        "adult" : { 
        "enabled" : true 
        }, 
        "room_charges" : { 
        "enabled" : false 
        } 
       } 
      ], 
      "status" : "OCCUPIED" 
     }, 
     { 
      "room_number" : "106", 
      "services" : [ 
       { 
        "adult" : { 
        "enabled" : false 
        }, 
        "room_charges" : { 
        "enabled" : true 
        } 
       } 
      ], 
      "status" : "OCCUPIED" 
     }, 
     { 
      "room_number" : "107", 
      "services" : [ 
       { 
        "adult" : { 
        "enabled" : false 
        }, 
        "room_charges" : { 
        "enabled" : false 
        } 
       } 
      ], 
      "status" : "OCCUPIED" 

我迄今完成的:

我試圖解析數據,並且我可以獲取要顯示的數據,但是,如果按照上面所述的方式完全按照我需要的方式進行佈局,則會遇到問題。目前,我的分析腳本輸出如下:

data 
roomCount: 105 

rooms 
0 
room_number: 104 

services 
0 
adult 
enabled: 1 

room_charges 
enabled: 1 

status: OCCUPIED 

我需要它不顯示嵌套數組「密鑰」。什麼正如我上面所說,我想是的輸出看起來像這樣:

Room Number: 104 
Adult: Enabled or Disabled (depending on true or false) 
Room Charges: Enabled or Disabled (depending on true or false) 
Status: OCCUPIED or UNOCCUPIED 

最後,這裏是我迄今完成的代碼:我正在尋找一些

<?php 
$string = file_get_contents("test.json"); 
$jsonIterator = new RecursiveIteratorIterator(
    new RecursiveArrayIterator(json_decode($string, TRUE)), 
    RecursiveIteratorIterator::SELF_FIRST); 

foreach ($jsonIterator as $key => $val) { 
    if(is_array($val)) { 
     echo "<br> $key"; 
    } else { 
     echo "<br> $key: $val <br>"; 
    } 
} 

?> 

改進以更清潔的方式輸出數據。如果你能幫忙或給我任何建議/建議,我將不勝感激。

+0

什麼是文件的大小。 – BojanT 2014-09-30 23:54:13

+0

所以最新的問題在這裏? – Ghost 2014-09-30 23:58:50

+0

該文件是1478行代碼。 37KB。我正在尋找輸出幫助。我需要它以一種乾淨整潔的用戶友好的方式來反映我在我的問題中解釋的內容。 – ValleyDigital 2014-10-01 00:00:54

回答

2

下面是JSON解碼爲對象

$arr = json_decode($jsonString); 
$out = ""; 
foreach ($arr->data->rooms as $k => $v) { 
    $adult = $v->services[0]->adult->enabled == 'true' ? 'Enabled' : 'Disabled'; 
    $room = $v->services[0]->room_charges->enabled == 'true' ? 'Enabled' : 'Disabled'; 
    $out .="Room Number: $v->room_number\n"; 

    $out .="Adult: $adult\n"; 
    $out .="Room Charges: $room\n"; 
    $out .="Status: $v->status\n"; 
    $out .= "----\n"; 
} 
echo $out; 

測試,這裏是一個輸出

Room Number: 104 
Adult: Enabled 
Room Charges: Enabled 
Status: OCCUPIED 
---- 
Room Number: 105 
Adult: Enabled 
Room Charges: Disabled 
Status: OCCUPIED 
---- 
Room Number: 106 
Adult: Disabled 
Room Charges: Enabled 
Status: OCCUPIED 
---- 
+0

謝謝!這正是我所需要的,並且輸出是完美的。 – ValleyDigital 2014-10-01 00:17:19

1

基本上你只需要檢查,如果該鍵和值設置:

$jsonIterator = new RecursiveIteratorIterator(
    new RecursiveArrayIterator(json_decode($json, TRUE)), 
    RecursiveIteratorIterator::SELF_FIRST); 

foreach ($jsonIterator as $key=>$value) { 
    if($key === 'room_number') { 
     echo "Room Number: " . $value . "<br />"; 
    } 
    if($key === 'adult') { 
     echo "Adult: " . $value['enabled'] . "<br />"; 
    } 
    if($key === 'status') { 
     echo "status: " . $value . "<br />"; 
    } 
} 
1

爲了便於說明,您可以在此案例中使用表格或說明列表。 UI取決於您:

<?php 

$response = '{ "apiVersion": "0.1", "data": { "roomCount": 105, "rooms": [ { "room_number": "104", "services": [ { "adult": { "enabled": true }, "room_charges": { "enabled": true } } ], "status": "OCCUPIED" }, { "room_number": "105", "services": [ { "adult": { "enabled": true }, "room_charges": { "enabled": false } } ], "status": "OCCUPIED" }, { "room_number": "106", "services": [ { "adult": { "enabled": false }, "room_charges": { "enabled": true } } ], "status": "OCCUPIED" }, { "room_number": "107", "services": [ { "adult": { "enabled": false }, "room_charges": { "enabled": false } } ], "status": "OCCUPIED" } ] }}'; 
$data = json_decode($response, true); 

?> 

<style type="text/css">/*DL, DT, DD TAGS LIST DATA*/dl { margin-bottom:50px;} dl dt { background:#5f9be3; color:#fff; float:left; font-weight:bold; margin-right:10px; padding:5px; width:150px; } dl dd { margin:2px 0; padding:5px 0;}</style> 
<dl> 
<?php foreach($data['data']['rooms'] as $info): ?> 
    <dt>Room Number: </dt> 
    <dd><?php echo $info['room_number']; ?></dd> 
    <?php $services = reset($info['services']); ?> 
    <dt>Adult: </dt> 
    <dd><?php echo ($services['adult']['enabled'] == 1) ? 'ENABLED' : 'DISABLED'; ?></dd> 
    <dt>Room Charges: </dt> 
    <dd><?php echo ($services['room_charges']['enabled'] == 1) ? 'ENABLED' : 'DISABLED'; ?></dd> 
    <dt>Status: </dt> 
    <dd><?php echo $info['status']; ?></dd><br/> 
<?php endforeach; ?> 
</dl>