使用 PHP for 和 foreach 循环从 JSON 数据中检索视频信息时遇到问题 - YouTube API 3

Posted

技术标签:

【中文标题】使用 PHP for 和 foreach 循环从 JSON 数据中检索视频信息时遇到问题 - YouTube API 3【英文标题】:Trouble retrieving video info from JSON data using PHP for and foreach loops - YouTube API 3 【发布时间】:2015-06-28 15:39:28 【问题描述】:

基本上我想列出 YouTube 频道的最后上传,但我在使用 for 循环时遇到了问题,或者我也缺少 foreach 使用。

我尝试了以下方法:

function last_uploads() 
for($i = 0; $i < 20; )
        error_reporting(E_ALL);
        $url =      'https://www.googleapis.com/youtube/v3/search?order=date&part=snippet&channelId=UCBR8-60-B28hp2BmDPdntcQ&maxResults=3&key=key&type=video';
        $json = file_get_contents($url);
        $json_data = json_decode($json, false);
        $id = $json_data->items[0]->id->videoId;
                echo '<iframe id="ytplayer" type="text/html"   
                src="http://www.youtube.com/embed/' . $id . '?rel=0&showinfo=1"
                frameborder="0" allowfullscreen></iframe><br class="clear" />';

        $i++;
        break;

feed url ($url) 的输出如下:

    
 "kind": "youtube#searchListResponse",
 "etag": "\"IHLB7Mi__JPvvG2zLQWAg8l36UU/sa0AWnsYjVk9MPM3sjMlLcrfFxU\"",
 "nextPageToken": "CAMQAA",
 "pageInfo": 
  "totalResults": 219,
  "resultsPerPage": 3
 ,
 "items": [
  
   "kind": "youtube#searchResult",
   "etag": "\"IHLB7Mi__JPvvG2zLQWAg8l36UU/2QHwn2uxHHlB9OQ9ViQw0LdnQwI\"",
   "id": 
    "kind": "youtube#video",
    "videoId": "AbqT_ubkT0Y"
   ,
   "snippet": 
    "publishedAt": "2015-03-03T17:44:56.000Z",
    "channelId": "UCBR8-60-B28hp2BmDPdntcQ",
    "title": "#DearMe - What Advice Would You Give Your Younger Self?",
    "description": "Share your advice by making your own #DearMe GIF at http://youtubedearme.com ** In celebration of International Women's Day, take part in YouTube's global ...",
    "thumbnails": 
     "default": 
      "url": "https://i.ytimg.com/vi/AbqT_ubkT0Y/default.jpg"
     ,
     "medium": 
      "url": "https://i.ytimg.com/vi/AbqT_ubkT0Y/mqdefault.jpg"
     ,
     "high": 
      "url": "https://i.ytimg.com/vi/AbqT_ubkT0Y/hqdefault.jpg"
     
    ,
    "channelTitle": "YouTube",
    "liveBroadcastContent": "none"
   
  ,
  
   "kind": "youtube#searchResult",
   "etag": "\"IHLB7Mi__JPvvG2zLQWAg8l36UU/PoM38fElRhJodbFBOt_g1xgJ2RE\"",
   "id": 
    "kind": "youtube#video",
    "videoId": "OUmMAAPX6E8"
   ,
   "snippet": 
    "publishedAt": "2015-02-23T14:35:35.000Z",
    "channelId": "UCBR8-60-B28hp2BmDPdntcQ",
    "title": "Introducing the YouTube Kids app",
    "description": "Download YouTube Kids for free on your android or ios device. Android: http://goo.gl/SsDTHh iOS: http://goo.gl/P0cikI The YouTube Kids app is designed for ...",
    "thumbnails": 
     "default": 
      "url": "https://i.ytimg.com/vi/OUmMAAPX6E8/default.jpg"
     ,
     "medium": 
      "url": "https://i.ytimg.com/vi/OUmMAAPX6E8/mqdefault.jpg"
     ,
     "high": 
      "url": "https://i.ytimg.com/vi/OUmMAAPX6E8/hqdefault.jpg"
     
    ,
    "channelTitle": "YouTube",
    "liveBroadcastContent": "none"
   
  ,
  
   "kind": "youtube#searchResult",
   "etag": "\"IHLB7Mi__JPvvG2zLQWAg8l36UU/-017SY9hNMURE5Slk5j5CU087wE\"",
   "id": 
    "kind": "youtube#video",
    "videoId": "SDdXVOD4llU"
   ,
   "snippet": 
    "publishedAt": "2015-01-24T02:59:11.000Z",
    "channelId": "UCBR8-60-B28hp2BmDPdntcQ",
    "title": "Highlights From the YouTube Interview with President Obama",
    "description": "On Jan 22, 2015, President Obama sat down for his first interview after the State of the Union with popular YouTube creators, Bethany Mota, Hank Green and ...",
    "thumbnails": 
     "default": 
      "url": "https://i.ytimg.com/vi/SDdXVOD4llU/default.jpg"
     ,
     "medium": 
      "url": "https://i.ytimg.com/vi/SDdXVOD4llU/mqdefault.jpg"
     ,
     "high": 
      "url": "https://i.ytimg.com/vi/SDdXVOD4llU/hqdefault.jpg"
     
    ,
    "channelTitle": "YouTube",
    "liveBroadcastContent": "none"
   
  
 ]

问题是last_uploads() 返回最后一个视频并不断重复,直到出现120 seconds exceeded 错误。

有什么想法吗?

问候,

谢谢!

【问题讨论】:

【参考方案1】:

只是搞砸了。

    您的 for 循环将无限期执行直到超时,因为 $i++ 位于 for 循环之后。 (事实上​​,甚至不需要 for 循环,因为您正在从频道中获取最新的 3 个视频 - 无需这样做 20 次)。

    您的代码仅获取返回的第一个视频的 ID。这是 for 循环应该循环遍历结果的地方。

    foreach ( $json_data->items as $item ) $id = $item->id->videoId; # 打印你的东西

【讨论】:

非常感谢,你是天才:)【参考方案2】:

感谢 @johnh10 [ answer ],删除 for 循环使其正常工作:

function last_uploads() 
        $url = 'https://www.googleapis.com/youtube/v3/search?order=date&part=snippet&channelId=UCBR8-60-B28hp2BmDPdntcQ&maxResults=3&key=key&type=video';
        $json = file_get_contents($url);
        $json_data = json_decode($json, false);
        foreach ( $json_data->items as $item ) 
            $id = $item->id->videoId;
            echo '<iframe id="ytplayer" type="text/html"   
                src="http://www.youtube.com/embed/' . $id . '?rel=0&showinfo=1"
                frameborder="0" allowfullscreen></iframe><br class="clear" />';
        

谢谢约翰 :)

【讨论】:

以上是关于使用 PHP for 和 foreach 循环从 JSON 数据中检索视频信息时遇到问题 - YouTube API 3的主要内容,如果未能解决你的问题,请参考以下文章

PHP数组循环?

php中for循环与foreach循环效率比较

for循环 switch foreach用法合区别

请问php中如何用for循环遍历出关联数组,不要用foreach,用for循环哦

php foreach为啥比for效率高

php中的for 和foreach性能对比