PHP - 包含重复项的 YouTube API 数组

Posted

技术标签:

【中文标题】PHP - 包含重复项的 YouTube API 数组【英文标题】:PHP - YouTube API array including duplicates 【发布时间】:2021-01-15 11:24:29 【问题描述】:

我正在使用 php 来利用 YouTube API 来构建视频数组,然后将它们存储在 JSON 文件中。我从中抓取视频的播放列表有 143 个视频。出于某种原因,我的函数正在生成一个包含 150 个视频的数组(其中 7 个视频是重复的)。

$videoArray = array();
function callone($playlistId, $nextpagetoken='') 
  $apikey = 'myapikey';
  $arrContextOptions=array(
    'ssl'=>array(
      'verify_peer'=>false,
      'verify_peer_name'=>false
    ),
  );
  $dur = file_get_contents("https://www.googleapis.com/youtube/v3/playlistItems?playlistId=".urlencode($playlistId)."&part=snippet,contentDetails&maxResults=50&key=$apikey&pageToken=$nextpagetoken", false, stream_context_create($arrContextOptions));
  $youtubeInfo = json_decode($dur, true);
  $videos = $youtubeInfo['items'];
  for($i=0; $i<count($videos); $i++)
    $videoID = $videos[$i]['snippet']['resourceId']['videoId'];
    $thumbnail = $videos[$i]['snippet']['thumbnails']['medium']['url'];
    $title = $videos[$i]['snippet']['title'];
    $date = $videos[$i]['contentDetails']['videoPublishedAt'];

    $videoArray[$i] = array('videoID'=>$videoID, 'thumbnail'=>$thumbnail, 'title'=>$title, 'date'=>$date);
  
  if(isset($youtubeInfo['nextPageToken']))
    $videoArray = array_merge($videoArray, callone($playlistId, $youtubeInfo['nextPageToken']));

    unset($youtubeInfo['nextPageToken']);
  
  return $videoArray;

我无法弄清楚为什么有 7 个视频被复制。如果数组中已经存在视频 ID,我尝试使用 in_array() 来防止将视频添加到数组中,但这也不起作用:

if (!in_array($videoID, $videoArray)) 
    $videoArray[$i] = array('videoID'=>$videoID, 'thumbnail'=>$thumbnail, 'title'=>$title, 'date'=>$date);

有什么想法吗?


我已经通过使用 YouTube 视频 ID 作为数组键解决了这个问题,但是现在我无法解析 JSON。

JSON 文件如下所示:

[
    
        "0nexU4APLY0":
            "videoID":"0nexU4APLY0","thumbnail":"https:\/\/i.ytimg.com\/vi\/0nexU4APLY0\/mqdefault.jpg","title":"Lorem Ipsum","date":"2020-09-28T18:24:41Z"
        ,
        "PIYWT6VkCKI":
            "videoID":"PIYWT6VkCKI","thumbnail":"https:\/\/i.ytimg.com\/vi\/PIYWT6VkCKI\/mqdefault.jpg","title":"Dolor Sit","date":"2020-09-25T19:42:16Z"
        ,
        "LadKEstUlaA":
            "videoID":"LadKEstUlaA","thumbnail":"https:\/\/i.ytimg.com\/vi\/LadKEstUlaA\/mqdefault.jpg","title":"Emet","date":"2020-09-14T20:25:37Z"
        
    
]

由于视频 ID 是关键,我无法解析 JSON。现在似乎它没有被视为 javascript 中的数组。这是我的getJSON 调用的样子:

function getResults() 
    $.getJSON('/youtube.json', function(data) 
        console.log(data);
        var count = data[0].length;
        console.log(count);
        $(data[0]).each(function (i, video) 
            console.log(video);
        );
    );

我收到 undefinedcount 并且 .each 函数没有返回任何内容。

【问题讨论】:

简单建议:尝试使用 $videoID 作为 $videoArray 的键,然后使用 array_key_exists($videoID, $videoArray); @MiPnamic 成功了!问题是现在我似乎无法解析 JSON。 @MiPnamic 当我使用 $videoID 作为键时,它看起来不再被视为 Javascript 中的数组 【参考方案1】:

现在在 Javascript 中似乎没有被视为数组

没错。 PHP 的关联数组在通过 JSON 传输时会变成 JavaScript 对象。

我要做的第一件事是整理您的 PHP 生成的 JSON。消除重复项后,您可以通过仅存储值(而不是嵌套在另一个数组中)来简化响应

$videoArray = [];
$youtubeInfo = json_decode($dur); // let's stick with objects
foreach ($youtubeInfo->items as $video) 
    $videoId = $video->snippet->resourceId->videoId;
    $videoArray[$videoId] = [
        "videoID"   => $videoId,
        "thumbnail" => $video->snippet->thumbnails->medium->url,
        // etc
    ];

if(isset($youtubeInfo->nextPageToken))
    $videoArray = array_merge($videoArray, callone($playlistId, $youtubeInfo->nextPageToken));

return $videoArray;

还有你第一次打电话给callone()的地方

$videos = callone("whatever");
// just store the values
file_put_contents("youtube.json", json_encode(array_values($videos)));

现在您的 JavaScript 可以轻松解析视频对象的平面数组。

function getResults() 
  $.getJSON('/youtube.json', function(data) 
    console.log(data);
    var count = data.length;
    console.log(count);
    data.foreach((video, i) => 
      console.log(video)
    )
  );

【讨论】:

感谢您的详细回复和帮助优化代码(以及问题)!非常感谢。

以上是关于PHP - 包含重复项的 YouTube API 数组的主要内容,如果未能解决你的问题,请参考以下文章

Youtube PHP APi 检查视频是不是重复

如何使用 youtube api 一次更新多个播放列表项的位置?

Youtube api V3 nextPageToken 重复

YouTube API v3无法正常使用[重复]

PHP - 在 OAuth 之后获取频道 ID - YouTube API

带有 Google PHP SDK 的 YouTube API - 以 JSON 格式响应