使用PHP循环分页数据JSON

使用PHP循环分页数据JSON,php,json,Php,Json,我正在使用RESTAPI,它以分页格式返回数据。1页将有100条记录。如果有更多数据,将定义一个“hasMore”参数和“offset”参数,您可以使用该参数检索下一页的结果 到目前为止,我得到了以下代码: function getData(){ $curl = curl_init(); curl_setopt_array($curl, array( CURLOPT_URL => "ENDPOINT", CURLOPT_RETURNTRANSFER

我正在使用RESTAPI,它以分页格式返回数据。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
}
我的问题是,我正在努力让它检查是否有更多的数据,以及是否有下一页的请求都在同一个函数中。我希望这是有意义的,我将感谢您提供的任何帮助或建议


现在我有它的工作,因为我知道还有另一页。问题是如何创建它,以便它检查参数以查看是否有更多的页面请求,以及是否有另一个页面请求并附加到现有的数据数组中

您的函数很好,但是您应该真正将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);
函数getData(){ $curl=curl_init(); curl_setopt_数组($curl,数组( CURLOPT_URL=>“端点”, CURLOPT_RETURNTRANSFER=>true, CURLOPT_编码=>“”, CURLOPT_MAXREDIRS=>10, CULLOPT_超时=>30, CURLOPT_HTTP_VERSION=>CURL_HTTP_VERSION_1_1, CURLOPT_CUSTOMREQUEST=>“获取”, CURLOPT_HTTPHEADER=>数组( “缓存控制:无缓存” ), )); $response=curl\u exec($curl); $data=json_decode($response); return$data;//返回结果以供使用 } 做{ $data=getData(); $i=0; 对于(i=0;ihasMore=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);
函数getData(){ $curl=curl_init(); curl_setopt_数组($curl,数组( CURLOPT_URL=>“端点”, CURLOPT_RETURNTRANSFER=>true, CURLOPT_编码=>“”, CURLOPT_MAXREDIRS=>10, CULLOPT_超时=>30, CURLOPT_HTTP_VERSION=>CURL_HTTP_VERSION_1_1, CURLOPT_CUSTOMREQUEST=>“获取”, CURLOPT_HTTPHEADER=>数组( “缓存控制:无缓存” ), )); $response=curl\u exec($curl); $data=json_decode($response); return$data;//返回结果以供使用 } 做{ $data=getData(); $i=0; 对于(i=0;ihasMore=1);
基于@TommyLee answer,但使用返回的偏移量(仅猜测应该如何使用):

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


同样,偏移量是如何使用的还不清楚,因此您可能需要调整我的示例,以适应基于@tommyley answer的
$offset

的正确用法,但使用返回的偏移量(仅猜测应该如何使用它):

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


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

的正确用法这很好,但它没有使用OP提到的“offset”参数(OP的示例代码也没有,但我认为这是问题的一部分)。可能需要将此偏移量传递到
getData()
,以便它获取下一页/批数据。这很好,但它没有使用OP提到的“offset”参数(OP的示例代码也没有,但我认为这是问题的一部分)。可能需要将此偏移量传递到
getData())
以便获取下一页/批数据。API端点希望如何将
偏移量
作为查询字符串参数传递给它(如端点?偏移量=x)或者作为文章正文的一部分?示例代码在第二个curl请求中实际上没有使用
$offset
。我在第二个curl请求中将offset参数作为查询字符串的一部分传递。而不是在您提供的代码中。API端点希望如何将
offset
作为查询字符串参数传递给它(类似端点?偏移=x)或者作为帖子正文的一部分?您的示例代码在第二个curl请求中没有实际使用
$offset
。我在第二个curl请求中将offset参数作为查询字符串的一部分传递。不是在您提供的代码中。我修改了此参数并自发布了类似问题的答案-我修改了此参数并自发布了t他回答了一个类似的问题-