2017-08-20 9 views
1

私は出力としてビデオストリームを返すPHPスクリプトを持っています。出力には複数の一意のストリームが含まれます。複数のforeachループからのjson出力を結合する

私は、JSONへの出力をエンコードしようとしていますが、理由は、複数のforeachループのそのは

コード適切な出力を与えていない:上記のコード

<?php 

if (isset($_GET["id"])) 
    $id = $_GET["id"]; 
$temp = explode("=",$id); 
$link=end($temp); 

parse_str(file_get_contents('http://www.youtube.com/get_video_info?video_id='.$link), $video_data); 
$streams = $video_data['url_encoded_fmt_stream_map']; 
$streams = explode(',',$streams); 

$arr = array(); 

foreach ($streams as $streamdata) { 
    parse_str($streamdata,$streamdata); 
    foreach ($streamdata as $key => $value) { 
     $myObj->$key = $value; 
    } 
    $arr = $myObj; 
} 

echo json_encode(array("streams"=>$arr)); 
?> 

が出力から最後のストリーム/アイテムを返します。

出力:

{ 
    "streams":{ 
     "quality":"small", 
     "type":"video\/3gpp; codecs=\"mp4v.20.3, mp4a.40.2\"", 
     "itag":"17", 
     "url":"video_link" 
    } 
} 

私は、上のforeachループ内echo json_encode(array("streams"=>$arr));を置く場合。 複数のルートノードを持つすべてのストリームが返され、受け入れられません。 すべての蒸気を含むルートノードが1つだけ必要です。

出力:

{ 
    "streams":{ 
     "type":"video\/mp4; codecs=\"avc1.64001F, mp4a.40.2\"", 
     "itag":"22", 
     "url":"video_link", 
     "quality":"hd720" 
    } 
    }{ 
    "streams":{ 
     "type":"video\/webm; codecs=\"vp8.0, vorbis\"", 
     "itag":"43", 
     "url":"video_link", 
     "quality":"medium" 
    } 
    }{ 
    "streams":{ 
     "type":"video\/mp4; codecs=\"avc1.42001E, mp4a.40.2\"", 
     "itag":"18", 
     "url":"video_link", 
     "quality":"medium" 
    } 
    }{ 
    "streams":{ 
     "type":"video\/3gpp; codecs=\"mp4v.20.3, mp4a.40.2\"", 
     "itag":"36", 
     "url":"video_link", 
     "quality":"small" 
    } 
    }{ 
    "streams":{ 
     "type":"video\/3gpp; codecs=\"mp4v.20.3, mp4a.40.2\"", 
     "itag":"17", 
     "url":"video_link", 
     "quality":"small" 
    } 
} 

所望の出力は次のようになります。

{ 
    "streams":[ 
    { 
    "quality":"hd720", 
    "itag":"44", 
    "url":"video_link", 
    "type":"video\/3gpp; codecs=\"mp4v.20.3, mp4a.40.2\"" 
    }, 
    { 
    "quality":"medium", 
    "itag":"", 
    "url":"video_link", 
    "type":"video\/3gpp; codecs=\"mp4v.20.3, mp4a.40.2\"" 
    }, 
    { 
    "quality":"medium", 
    "itag":"17", 
    "url":"video_link", 
    "type":"video\/3gpp; codecs=\"mp4v.20.3, mp4a.40.2\"" 
    }, 
    { 
    "quality":"medium", 
    "itag":"17", 
    "url":"video_link", 
    "type":"video\/3gpp; codecs=\"mp4v.20.3, mp4a.40.2\"" 
    }, 
    { 
    "quality":"small", 
    "itag":"17", 
    "url":"video_link", 
    "type":"video\/3gpp; codecs=\"mp4v.20.3, mp4a.40.2\"" 
    }, 
    { 
    "quality":"small", 
    "itag":"17", 
    "url":"video_link", 
    "type":"video\/3gpp; codecs=\"mp4v.20.3, mp4a.40.2\"" 
    } 

] 
    } 

は、複数のルートノードをコーミングする方法はありますかすべてのストリームをJSON出力を得ます。

注:

  • 外foreachループの反復するスクリプト寿命の5倍
  • インナーforeachループの反復するスクリプト寿命の各外側のforeachループ4回

としてこれで私を助けてください私はPHPに新しいです。 TIA !!!

+1

ご希望の出力の例を教えてください。 answerで提供された出力に無効なJSONデータが含まれています。あなたが望む出力、またはあなたのコードによって現在生成されている出力(望まないもの)として言及しているかどうかは不明です – Nima

+0

'$ video_data'と所望の出力。 –

+0

@Nima @N Moeini私は質問をediedし、望ましい出力を追加しました。 URLの値は異なります。 – xamDev

答えて

3

をこれをテストし、出力を得ました。

<?php 
if (isset($_GET["id"])) 
    $id = $_GET["id"]; 
$temp = explode("=",$id); 
$link=end($temp); 

parse_str(file_get_contents('http://www.youtube.com/get_video_info?video_id='.$link), $video_data); 
$streams = $video_data['url_encoded_fmt_stream_map']; 
$streams = explode(',',$streams); 

$arr = array(); 

foreach ($streams as $streamdata) { 
    parse_str($streamdata,$streamdata); 
    $myObj = new stdClass(); 
    foreach ($streamdata as $key => $value) { 
     $myObj->$key = $value; 
    } 
    array_push($arr, $myObj); 
} 


print_r (json_encode(array("streams"=>$arr))); 
?> 

出力:

{ 
    "streams": [{ 
      "itag": "22", 
      "url": "https:\/\/r5---sn-q4fl6nlz.googlevideo.com\/videoplayback?expire=1503278582&mm=31&mv=m&pl=14&mt=1503256900&ms=au&ei=luGZWY6yCc-I-wOk15GgAQ&signature=703194A7AAF91601C8B1A3D674CDEE89D9B7F7D4.489762A45FA4A3A72D00974427199FCFF1538CF9&source=youtube&beids=%5B9466594%5D&mn=sn-q4fl6nlz&requiressl=yes&mime=video%2Fmp4&ipbits=0&initcwndbps=997500&pcm2=yes&lmt=1502949906234234&dur=250.938&itag=22&ip=172.251.185.232&sparams=dur%2Cei%2Cid%2Cinitcwndbps%2Cip%2Cipbits%2Citag%2Clmt%2Cmime%2Cmm%2Cmn%2Cms%2Cmv%2Cpcm2%2Cpl%2Cratebypass%2Crequiressl%2Csource%2Cexpire&ratebypass=yes&id=o-AIo4CAPPPE9wPzwlmOhlF16F8YLqOYKrKwH0STEOsWbH&key=yt6", 
      "type": "video\/mp4; codecs=\"avc1.64001F, mp4a.40.2\"", 
      "quality": "hd720" 
     }, { 
      "itag": "43", 
      "url": "https:\/\/r5---sn-q4fl6nlz.googlevideo.com\/videoplayback?expire=1503278582&mm=31&mv=m&pl=14&mt=1503256900&ms=au&ei=luGZWY6yCc-I-wOk15GgAQ&signature=4333D8109A90B3DC6844C6A6930A8558ECCC2A05.B736A90E09E2A47A4B3E1630CDD260099A15E17C&source=youtube&beids=%5B9466594%5D&mn=sn-q4fl6nlz&requiressl=yes&clen=25853304&ipbits=0&initcwndbps=997500&pcm2=yes&lmt=1502953964372465&dur=0.000&itag=43&mime=video%2Fwebm&ip=172.251.185.232&sparams=clen%2Cdur%2Cei%2Cgir%2Cid%2Cinitcwndbps%2Cip%2Cipbits%2Citag%2Clmt%2Cmime%2Cmm%2Cmn%2Cms%2Cmv%2Cpcm2%2Cpl%2Cratebypass%2Crequiressl%2Csource%2Cexpire&ratebypass=yes&id=o-AIo4CAPPPE9wPzwlmOhlF16F8YLqOYKrKwH0STEOsWbH&gir=yes&key=yt6", 
      "type": "video\/webm; codecs=\"vp8.0, vorbis\"", 
      "quality": "medium" 
     }, { 
      "itag": "18", 
      "url": "https:\/\/r5---sn-q4fl6nlz.googlevideo.com\/videoplayback?expire=1503278582&mm=31&mv=m&pl=14&mt=1503256900&ms=au&ei=luGZWY6yCc-I-wOk15GgAQ&signature=2F70C59BD7F8F63DCEFA2935882935245A04C40B.E3D4DA76837E3DC74B795B17982796C11BCEBF53&source=youtube&beids=%5B9466594%5D&mn=sn-q4fl6nlz&requiressl=yes&clen=18940088&ipbits=0&initcwndbps=997500&pcm2=yes&lmt=1502949691460473&dur=250.938&itag=18&mime=video%2Fmp4&ip=172.251.185.232&sparams=clen%2Cdur%2Cei%2Cgir%2Cid%2Cinitcwndbps%2Cip%2Cipbits%2Citag%2Clmt%2Cmime%2Cmm%2Cmn%2Cms%2Cmv%2Cpcm2%2Cpl%2Cratebypass%2Crequiressl%2Csource%2Cexpire&ratebypass=yes&id=o-AIo4CAPPPE9wPzwlmOhlF16F8YLqOYKrKwH0STEOsWbH&gir=yes&key=yt6", 
      "type": "video\/mp4; codecs=\"avc1.42001E, mp4a.40.2\"", 
      "quality": "medium" 
     }, { 
      "itag": "36", 
      "url": "https:\/\/r5---sn-q4fl6nlz.googlevideo.com\/videoplayback?expire=1503278582&mm=31&mv=m&pl=14&mt=1503256900&ms=au&ei=luGZWY6yCc-I-wOk15GgAQ&signature=914720619C03249F8A94B02CA36F95D2CD8A50E7.8C06516CEFD9667BEEA2950F63FEDBF701E85D69&source=youtube&beids=%5B9466594%5D&mn=sn-q4fl6nlz&requiressl=yes&clen=6819898&ipbits=0&initcwndbps=997500&pcm2=yes&lmt=1502949683841137&dur=250.961&itag=36&mime=video%2F3gpp&ip=172.251.185.232&sparams=clen%2Cdur%2Cei%2Cgir%2Cid%2Cinitcwndbps%2Cip%2Cipbits%2Citag%2Clmt%2Cmime%2Cmm%2Cmn%2Cms%2Cmv%2Cpcm2%2Cpl%2Crequiressl%2Csource%2Cexpire&id=o-AIo4CAPPPE9wPzwlmOhlF16F8YLqOYKrKwH0STEOsWbH&gir=yes&key=yt6", 
      "type": "video\/3gpp; codecs=\"mp4v.20.3, mp4a.40.2\"", 
      "quality": "small" 
     }, { 
      "itag": "17", 
      "url": "https:\/\/r5---sn-q4fl6nlz.googlevideo.com\/videoplayback?expire=1503278582&mm=31&mv=m&pl=14&mt=1503256900&ms=au&ei=luGZWY6yCc-I-wOk15GgAQ&signature=A2741E73F8FF9500D84A3A2E69F84536F7168B38.BB6575A1C38784D6841F2D8788FDEE38D4F0DA2B&source=youtube&beids=%5B9466594%5D&mn=sn-q4fl6nlz&requiressl=yes&clen=2446985&ipbits=0&initcwndbps=997500&pcm2=yes&lmt=1502949684640176&dur=250.961&itag=17&mime=video%2F3gpp&ip=172.251.185.232&sparams=clen%2Cdur%2Cei%2Cgir%2Cid%2Cinitcwndbps%2Cip%2Cipbits%2Citag%2Clmt%2Cmime%2Cmm%2Cmn%2Cms%2Cmv%2Cpcm2%2Cpl%2Crequiressl%2Csource%2Cexpire&id=o-AIo4CAPPPE9wPzwlmOhlF16F8YLqOYKrKwH0STEOsWbH&gir=yes&key=yt6", 
      "type": "video\/3gpp; codecs=\"mp4v.20.3, mp4a.40.2\"", 
      "quality": "small" 
     }] 
} 
+0

まさに私が欲しいもの! – xamDev

+0

他人を助けるための答えとして記入してください。乾杯! –

1

これは、所望の出力を与える必要があります。

<?php 

if (isset($_GET["id"])) 
    $id = $_GET["id"]; 
$temp = explode("=",$id); 
$link=end($temp); 

parse_str(file_get_contents('http://www.youtube.com/get_video_info?video_id='.$link), $video_data); 
$streams = $video_data['url_encoded_fmt_stream_map']; 
$streams = explode(',',$streams); 

$arr = array(); 

foreach ($streams as $streamdata) { 
    parse_str($streamdata,$streamdata); 
    foreach ($streamdata as $key => $value) { 
     $arr[] = [$key => $streamdata[$key]] 
    } 
} 

echo json_encode(array("streams"=>$arr)); 
?> 
+0

このソリューションでは、説明で要求された出力が生成されないと思います。 –

+0

@セバスチャンありがとうございますが、キーなしでのみ値を出力します – xamDev

+0

私は答えを更新しました。これで問題は解決しますか? –

関連する問題