Facebook SDK (5.0) - 图 API 请求 - 分页(如何获得所有结果)
Facebook SDK (5.0) - Graph API Request - Pagination (How to get ALL results)
我正在开发一个简单的 Facebook 应用程序,它需要获取用户的所有页面赞,以便将它们与作为匹配标识符的预先构建的页面 ID 列表进行比较。
我可以得到一个喜欢的列表;但是,我只能在回复中获得 100 个赞 "per page"。其中一些人有数千个赞,所以我需要确保我可以从所有页面收集所有数据。
一个简单的 $fb->next($response);会给我下一页(所以我可以获得 200 个而不是 100 个赞).. 但是,当我将其放入循环时,我的脚本陷入了无限循环,因为似乎 always 是一个 "next" 页面,即使没有结果。
是否有任何内置方法可以轻松循环遍历这些结果,或者我是否必须在每次迭代时检查请求级数据结构以确定项目是否已返回数据?
//this results in an infinite loop
$request = $fb->request('GET', '/'.$fid['id'].'/likes?limit=9999');
do {
$graphNode = $fb->getClient()->sendRequest($request);
$paging = $graphNode->getGraphEdge();
$graphEdge = $graphNode->getGraphEdge()->asArray();
$likes = array_merge($likes, $graphEdge);
} while ($fb->next($paging)); // ERROR IS HERE!! SET while($paging = $fb->next($paging)); INSTEAD
通过回复评论更新如下:
$request = $fb->request('GET', '/'.$fid['id'].'/likes?limit=9999');
$graphNode = $fb->getClient()->sendRequest($request);
$graphEdge = $graphNode->getGraphEdge();
if ($fb->next($graphEdge)) {
$likesArray = $graphEdge->asArray();
$lc = count($likesArray);
$totalLikes = array_merge($totalLikes, $likesArray);
while ($graphEdge = $fb->next($graphEdge)) {
$likesArray = $graphEdge->asArray();
$lic = count($likesArray);
$totalLikes = array_merge($totalLikes, $likesArray);
}
} else {
$likesArray = $graphEdge->asArray();
$totalLikes = array_merge($totalLikes, $likesArray);
}
这是我一直使用的。您始终可以通过将 $likes 变量更改为 $data 参数并通过该函数传递其他 GraphEdge 调用来使用循环是一个函数。
$getPages = $this->fb->get('/me/likes?limit=100');
$likes = $getPages->getGraphEdge();
$totalLikes = array();
if ($this->fb->next($likes)) {
$likesArray = $likes->asArray();
$totalLikes = array_merge($totalLikes, $likesArray);
while ($likes = $this->fb->next($likes)) {
$likesArray = $likes->asArray();
$totalLikes = array_merge($totalLikes, $likesArray);
}
} else {
$likesArray = $likes->asArray();
$totalLikes = array_merge($totalLikes, $likesArray);
}
return $totalLikes;
或者简单的方法:
do {
foreach ($response->asArray() as $item){
//do something with it
}
} while($response = $facebookApp->next($response));
正如@Alborq 提到的,我认为使用这样的 do while
循环更有意义:
$apiData = [];
$response = $fb->get($endpoint);
$edge = $response->getGraphEdge();
do {
$arrayFromThisEdge = $edge->asArray();
$apiData = array_merge($apiData, $arrayFromThisEdge);
} while ($edge = $fb->next($edge));
return $apiData;
(不幸的是,在 my particular case 中,我认为可能存在 Facebook 错误。)
我正在开发一个简单的 Facebook 应用程序,它需要获取用户的所有页面赞,以便将它们与作为匹配标识符的预先构建的页面 ID 列表进行比较。
我可以得到一个喜欢的列表;但是,我只能在回复中获得 100 个赞 "per page"。其中一些人有数千个赞,所以我需要确保我可以从所有页面收集所有数据。
一个简单的 $fb->next($response);会给我下一页(所以我可以获得 200 个而不是 100 个赞).. 但是,当我将其放入循环时,我的脚本陷入了无限循环,因为似乎 always 是一个 "next" 页面,即使没有结果。
是否有任何内置方法可以轻松循环遍历这些结果,或者我是否必须在每次迭代时检查请求级数据结构以确定项目是否已返回数据?
//this results in an infinite loop
$request = $fb->request('GET', '/'.$fid['id'].'/likes?limit=9999');
do {
$graphNode = $fb->getClient()->sendRequest($request);
$paging = $graphNode->getGraphEdge();
$graphEdge = $graphNode->getGraphEdge()->asArray();
$likes = array_merge($likes, $graphEdge);
} while ($fb->next($paging)); // ERROR IS HERE!! SET while($paging = $fb->next($paging)); INSTEAD
通过回复评论更新如下:
$request = $fb->request('GET', '/'.$fid['id'].'/likes?limit=9999');
$graphNode = $fb->getClient()->sendRequest($request);
$graphEdge = $graphNode->getGraphEdge();
if ($fb->next($graphEdge)) {
$likesArray = $graphEdge->asArray();
$lc = count($likesArray);
$totalLikes = array_merge($totalLikes, $likesArray);
while ($graphEdge = $fb->next($graphEdge)) {
$likesArray = $graphEdge->asArray();
$lic = count($likesArray);
$totalLikes = array_merge($totalLikes, $likesArray);
}
} else {
$likesArray = $graphEdge->asArray();
$totalLikes = array_merge($totalLikes, $likesArray);
}
这是我一直使用的。您始终可以通过将 $likes 变量更改为 $data 参数并通过该函数传递其他 GraphEdge 调用来使用循环是一个函数。
$getPages = $this->fb->get('/me/likes?limit=100');
$likes = $getPages->getGraphEdge();
$totalLikes = array();
if ($this->fb->next($likes)) {
$likesArray = $likes->asArray();
$totalLikes = array_merge($totalLikes, $likesArray);
while ($likes = $this->fb->next($likes)) {
$likesArray = $likes->asArray();
$totalLikes = array_merge($totalLikes, $likesArray);
}
} else {
$likesArray = $likes->asArray();
$totalLikes = array_merge($totalLikes, $likesArray);
}
return $totalLikes;
或者简单的方法:
do {
foreach ($response->asArray() as $item){
//do something with it
}
} while($response = $facebookApp->next($response));
正如@Alborq 提到的,我认为使用这样的 do while
循环更有意义:
$apiData = [];
$response = $fb->get($endpoint);
$edge = $response->getGraphEdge();
do {
$arrayFromThisEdge = $edge->asArray();
$apiData = array_merge($apiData, $arrayFromThisEdge);
} while ($edge = $fb->next($edge));
return $apiData;
(不幸的是,在 my particular case 中,我认为可能存在 Facebook 错误。)