使用PHP遍历分页数据JSON

时间:2018-07-16 23:27:58

标签: php json

我正在使用REST API,该API以分页格式返回数据。 1页将有100条记录。如果有更多数据,则将定义“ hasMore”参数和“ offset”参数,可用于检索下一页结果。

到目前为止,我有以下代码:

function getData(){
    $curl = curl_init();
    curl_setopt_array($curl, array(
      CURLOPT_URL => "ENDPOINT",
      CURLOPT_RETURNTRANSFER => true,
      CURLOPT_ENCODING => "",
      CURLOPT_MAXREDIRS => 10,
      CURLOPT_TIMEOUT => 30,
      CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
      CURLOPT_CUSTOMREQUEST => "GET",
      CURLOPT_HTTPHEADER => array(
        "cache-control: no-cache"
      ),
    ));
    $response = curl_exec($curl);
    $data = json_decode($response);

    //if there is more get them.....
    if($data->hasMore == 1){ //make another request...
        while($data->hasMore == 1){ 
            $offset = $data->offset;
            $curl = curl_init();
            curl_setopt_array($curl, array(
              CURLOPT_URL => "ENDPOINT",
              CURLOPT_RETURNTRANSFER => true,
              CURLOPT_ENCODING => "",
              CURLOPT_MAXREDIRS => 10,
              CURLOPT_TIMEOUT => 30,
              CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
              CURLOPT_CUSTOMREQUEST => "GET",
              CURLOPT_HTTPHEADER => array(
                "cache-control: no-cache"
              ),
            ));
            $response = curl_exec($curl);
            $data = json_decode($response);
            $allData = array_merge($data->data, $data->data);
        }
    }
    return $data; //return the results for use
}

我的问题是我正在努力让它检查是否有更多数据,以及是否在同一功能内都请求下一页。我希望这是有道理的,希望您能提供任何帮助或建议。

由于我知道还有另一页,现在我可以使用它。问题是如何创建它,以便它将检查参数以查看是否还有更多请求,以及是否存在另一个页面请求并将其追加到现有数据数组中。

2 个答案:

答案 0 :(得分:1)

您的函数很好,但是您应该真正将getData函数和循环部分分开。

function getData(){
    $curl = curl_init();
    curl_setopt_array($curl, array(
      CURLOPT_URL => "ENDPOINT",
      CURLOPT_RETURNTRANSFER => true,
      CURLOPT_ENCODING => "",
      CURLOPT_MAXREDIRS => 10,
      CURLOPT_TIMEOUT => 30,
      CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
      CURLOPT_CUSTOMREQUEST => "GET",
      CURLOPT_HTTPHEADER => array(
        "cache-control: no-cache"
      ),
    ));
    $response = curl_exec($curl);
    $data = json_decode($response);

    return $data; //return the results for use
}

do{
    $data = getData();
    $i = 0;
    for(i=0; i<data.length; i++){
         //do data processing here
    }
}while(data->hasMore == 1);

答案 1 :(得分:1)

基于@TommyLee答案,但使用返回的偏移量(只是猜测应该如何使用它):

function getData($offset = 0){
    $curl = curl_init();
    curl_setopt_array($curl, array(
      CURLOPT_URL => "ENDPOINT" . "?offset=" . $offset,
      CURLOPT_RETURNTRANSFER => true,
      CURLOPT_ENCODING => "",
      CURLOPT_MAXREDIRS => 10,
      CURLOPT_TIMEOUT => 30,
      CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
      CURLOPT_CUSTOMREQUEST => "GET",
      CURLOPT_HTTPHEADER => array(
        "cache-control: no-cache"
      ),
    ));
    $response = curl_exec($curl);
    $data = json_decode($response);

    return $data; //return the results for use
}

$allData = array();

do {
    $offset = $data->offset ?: 0;
    $data = getData($offset);

    foreach($data->data as $row){
         $allData[] = $row;
    }
} while($data->hasMore == 1);

这样,如果没有将任何内容传递给getData(),则它假定偏移量为0,否则,将上一个响应的下一个偏移量传递给它。

同样,还不清楚如何使用偏移量,因此您可能需要调整我的示例以适合$offset的正确用法。