2016-11-14 90 views
1

我嘗試使用php代碼解析json變量。問題是一些數組鍵包含每次迭代可更改的值。順便說一下,這不是一個重複的問題,沒有什麼比使用可變變量解析json。這裏是我的JSON例子和PHP代碼,也輸出;解析JSON使用可更改的鍵

{ 
    "link":"", 
    "host":"stream", 
    "filename":"Rock Ballads The Best Of 70-90's", 
    "icon":"https:\/\/i.ytimg.com\/vi\/JN80ayCfmW0\/hqdefault.jpg", 
    "streaming":{ 
     "audio track in mp3 (54.54MB)":"http:\/\/server.example.parsing.com\/str\/wlqcjv8246\/Rock+Ballads+The+Best+Of+70-90%26%23039%3Bs%28p%29.mp3", 
     "360p video in mp4 (80.04MB)":"http:\/\/server.example.parsing.com\/str\/wlqcjyfc33\/Rock+Ballads+The+Best+Of+70-90%26%23039%3Bs%28480p%29.mp4", 
     "240p video in mp4 (76.55MB)":"http:\/\/server.example.parsing.com\/str\/wlqck18b72\/Rock+Ballads+The+Best+Of+70-90%26%23039%3Bs%28240p%29.mp4", 
     "144p video in mp4 (71.09MB)":"http:\/\/server.example.parsing.com\/str\/wlqck4e410\/Rock+Ballads+The+Best+Of+70-90%26%23039%3Bs%28144p%29.mp4" 
    }, 
    "nb":0, 
    "error":"", 
    "paws":false 
} 

這是我使用的php代碼;

if($host=="www.youtube.com"){ 
    $decodeProcess = json_decode($output,true); 
    echo ($decodeProcess['filename']); 
    echo ($decodeProcess['icon']); 
    echo ($decodeProcess['streaming']['audio track in mp3 (54.54MB)']); 

} 

在這種情況下,文件名和圖標效果很好,但「在MP3(54.54MB)音軌」或「MP4(71.09MB)144P的視頻」是問題,我解析因爲每次文件大小更改。我能做什麼?

+0

只是爲了澄清,你的變量'$ host'是從json鍵'「host」'? – Kai

+1

你從哪裏得到這個JSON?一種解決方案可能是循環遍歷$ decodeProcess ['streaming']'並查看該密鑰是否包含mp3中的音頻軌道或其他內容。 –

+0

如果是這樣的話,那麼你想解析json並將'$ host'分配給'someJson-> host'的內容 – Kai

回答

1

你有沒有考慮過在數據結構上運行一個簡單的映射操作,使它變成一個更可行的形式(基本上是從鍵中刪除文件大小信息)?

這可能是這樣的:

if($host=="www.youtube.com"){ 
    $decodeProcess = json_decode($output,true); 
    // array of prefix matches that will be used as as substitution keys 
    $key_replacements = [ 
     'audio' => 'audio', 
     '360p video' => 'video_360p', 
     '240p video' => 'video_240p', 
     '144p video' => 'video_144p' 
    ]; 
    foreach($decodeProcess['streaming'] as $key => $value) { 
     foreach ($key_replacements as $prefix => $replacement) { 
      if (strpos($key, $prefix) === 0) { 
       $decodeProcess['streaming'][$replacement] = $value; 
       break; 
      } 
     } 
     unset($decodeProces['streaming'][$key]); 
    } 

    echo ($decodeProcess['filename']); 
    echo ($decodeProcess['icon']); 
    echo ($decodeProcess['streaming']['audio']); 
    echo ($decodeProcess['streaming']['video_360p']); 
} 

您可能希望再封裝整體的JSON反序列化和關鍵映射功能到它自己的函數或類方法當然。

+0

@AlperenÖzdemir對不起。在'$ key + replacements'數組定義中省略了逗號:P。固定。 –