2016-11-14 3 views
1

Я пытаюсь разобрать json-переменные с помощью php-кодов. Проблема заключается в том, что некоторые из ключей массива содержат изменяемые значения для каждой итерации. Кстати, это не дублирующий вопрос, нет ничего похожего на json-анализ с переменными переменными. Вот мой пример json и php-коды, а также вывод;Parsing 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)» или «144p видео в mp4 (71.09MB)» является проблемой для меня, чтобы разобрать, потому что каждый раз, когда изменяется размер файла. Что я могу сделать?

+0

Чтобы уточнить, ваша переменная '$ host' находится из json key' "host" '? – Kai

+1

Откуда вы получаете этот JSON? Одним из решений может быть цикл над $ decodeProcess ['streaming'] 'и посмотреть, содержит ли ключ' audio track в 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. Исправлена. –