Facebook SDK(5.0) - 图形API请求 - 分页(如何获得所有结果)

时间:2016-03-31 14:10:31

标签: php facebook facebook-graph-api facebook-php-sdk infinite-loop

我正在制作一个简单的Facebook应用程序,需要获取所有用户的页面喜欢,以便将它们与预先构建的页面ID列表列表作为匹配标识符进行比较。

我可以得到一份喜欢的名单;但是,我只能在响应中“每页”获得100个喜欢。其中一些人有成千上万的喜欢,所以我需要确保我可以从所有页面收集所有数据。

一个简单的$ fb-> next($ response);会得到我的下一页(所以不是100个喜欢,我可以得到200)..但是,当我把它扔进循环时,我的脚本陷入无限循环,因为似乎总是是即使没有结果,也会出现“下一页”。

是否有任何内置方法可以轻松地循环遍历这些结果,或者我是否必须在每次迭代时检查请求级数据结构是否已返回数据?

//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);

    }

3 个答案:

答案 0 :(得分:3)

这就是我一直用的东西。你总是可以通过将$ likes变量更改为$ data参数并通过函数传递其他GraphEdge调用来使用循环函数。

trunk

答案 1 :(得分:1)

或简单方法:

do {
    foreach ($response->asArray() as $item){
        //do something with it
    }
} while($response = $facebookApp->next($response));

答案 2 :(得分:0)

就像@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错误。)