组合来自多个foreach循环的

时间:2017-08-20 17:18:51

标签: php arrays json foreach

我有php脚本,它返回视频流作为输出。输出包含多个唯一流。

我正在尝试将输出编码为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"
    }
}

如果我将echo json_encode(array("streams"=>$arr));放在上部foreach循环中。 它将返回具有多个根节点的所有流,并且不可接受。 我只需要一个包含所有流的根节点。

输出:

{
     "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 !!!

2 个答案:

答案 0 :(得分: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"
        }]
}

答案 1 :(得分: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));
?>