我正在尝试从特定的YouTube频道中提取所有视频。
我收到了这个错误:
Fatal error: Call to undefined function getYTid() in C:\inetpub\wwwroot\ped.php on line 71
有什么建议吗?
class ChannelFeed {
function __construct($username){
$this->username=$username;
echo $this->username;
$this->feedUrl=$url='http://gdata.youtube.com/feeds/api/users/'.$username.'/uploads?orderby=updated';
$this->feed=simplexml_load_file($url);
}
public function getYTid() {
$ytURL = $this->feed->entry->link['href'];
$ytvIDlen = 11; // This is the length of YouTube's video IDs
// The ID string starts after "v=", which is usually right after
// "youtube.com/watch?" in the URL
$idStarts = strpos($ytURL, "?v=");
// In case the "v=" is NOT right after the "?" (not likely, but I like to keep my
// bases covered), it will be after an "&":
if($idStarts === FALSE)
$idStarts = strpos($ytURL, "&v=");
// If still FALSE, URL doesn't have a vid ID
if($idStarts === FALSE)
die("YouTube video ID not found. Please double-check your URL.");
// Offset the start location to match the beginning of the ID string
$idStarts +=3;
// Get the ID string and return it
$ytvID = substr($ytURL, $idStarts, $ytvIDlen);
return $ytvID;
}
public function showFullFeed(){
$vidarray = array();
foreach($this->feed->entry as $video){
$vidarray[] = $video->link['href'];
}
return $vidarray ;
}
};
$youtube = new ChannelFeed('channel_name');
$vids = $youtube->showFullFeed();
$vidIDs = array_map(getYTid(),$vids);
答案 0 :(得分:5)
我修改了这个以正常工作.....
class ChannelFeed {
function __construct($username){
$this->username=$username;
//$this->feedUrl=$url='http://gdata.youtube.com/feeds/api/users/'.$username.'/uploads?orderby=published';
$this->feedUrl=$url='http://gdata.youtube.com/feeds/api/videos?author=' . $username;
$this->feed=simplexml_load_file($url);
}
public function getYTid($links) {
$IDs = array();
foreach ($links as $href) {
$ytURL = $href;
//$ytURL = $this->feed->entry->link['href'];
$ytvIDlen = 11; // This is the length of YouTube's video IDs
// The ID string starts after "v=", which is usually right after
// "youtube.com/watch?" in the URL
$idStarts = strpos($ytURL, "?v=");
// In case the "v=" is NOT right after the "?" (not likely, but I like to keep my
// bases covered), it will be after an "&":
if($idStarts === FALSE)
$idStarts = strpos($ytURL, "&v=");
// If still FALSE, URL doesn't have a vid ID
if($idStarts === FALSE)
die("YouTube video ID not found. Please double-check your URL.");
// Offset the start location to match the beginning of the ID string
$idStarts +=3;
// Get the ID string and return it
$ytvID = substr($ytURL, $idStarts, $ytvIDlen);
$IDs[] = $ytvID;
}
return $IDs;
}
public function showFullFeed(){
$vidarray = array();
foreach($this->feed->entry as $video){
$vidarray[] = $video->link['href'];
}
return $vidarray;
}
};
$youtube = new ChannelFeed('channel_name');
$vids = $youtube->showFullFeed();
$vidIDs = $youtube->getYTid($vids);
答案 1 :(得分:1)
在不查看代码的其余部分的情况下,array_map
正在使用您班级的方法ChannelFeed
。根据{{3}},您必须使用数组来告诉它您希望作为回调应用的函数位于何处。
将代码的最后一行更改为:
$vidIDs = array_map(array($youtube, 'getYTid'), $vids);
答案 2 :(得分:0)
$vidIDs = array_map(getYTid(),$vids);
您不仅将调用getYTid()
的结果传递给array_map
而不是对函数的引用,而且您没有传递任何对象上下文...而getYTid
是成员函数。
再次阅读the documentation for array_map
,然后尝试:
$vidIDs = array_map(array($youtube, "getYTid"), $vids);
在PHP 5.3之前,默认情况下对象传递变为by-reference,您需要:
$vidIDs = array_map(array(&$youtube, "getYTid"), $vids);