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);
);
);
我收到 undefined
的 count
并且 .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 api 一次更新多个播放列表项的位置?
Youtube api V3 nextPageToken 重复