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


Facebook SDK (5.0) - Graph API Request - Pagination (How to get ALL results)

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

我可以得到一个点赞列表;然而,我在回复中"每页"只能获得100个赞。其中一些人有数千个赞,所以我需要确保我可以从所有页面收集所有数据。

一个简单的$fb->next($response);会给我下一页(所以我可以得到200个赞,而不是100个赞)。。但是,当我把它放入一个循环中时,我的脚本会陷入一个无限循环,因为似乎总是有一个"下一个"页面,即使没有结果。

是否有任何内置的方法可以轻松地循环这些结果,或者我是否必须在每次迭代中检查请求级别的数据结构,以确定项目是否返回了数据?

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

(不幸的是,在我的特殊情况下,我认为可能存在Facebook错误。)