如何使循环函数调用分页?

时间:2019-01-17 13:30:45

标签: php loops while-loop pagination offset

我正尝试使用Airtable API从那里的数据中检索记录-具体来说,是列单元格中具有的URL列表。

我编写了一个函数get_airtable_records,可以通过curl进行API调用,并且可以正常工作-作为Json对象返回结果。具体来说,我是将URL推送到数组$article_urls

唯一的问题是,Airtable将结果返回限制为最多100条记录的“页数”,而我的数据包含的内容不止于此。该API接受参数maxRecordspageSize,但更重要的参数pageSize仍限制为100。

Airtable还会返回另一个Json值offset,该值在这种情况下用于分页。 offset是旨在用作输入参数(也称为offset)的记录ID。 您可以使用它来表示随后的其他API调用中的开始记录。我明白这一点

我不了解的是如何修改代码以解决需要再次轮询Airtable的可能性。

换句话说,当没有offset值时,我们应该始终从头开始。 然后,如果在返回的结果中出现offset值,我们应该再试一次-直到不存在offset值。

这就是我所拥有的。

  // Make get request, store result in array
  $articles = get_airtable_records($offset); // $offset won't exist at the start

  // Prepare Article URLs list as an array
  if (!isset($article_urls)) {
     $article_urls = array();
  }

  // For each URL found in Airtable
  foreach($articles['records'] as $record){
     $url = $record['fields']['Published URL'];
     // Add to our array list
     if (!empty($url)) {
        array_push($article_urls, $url);
     }
  }

  // URL list after first pass:
  echo '<pre>';
  print_r($article_urls);
  echo '</pre>';
  // May hit a max of 100

  // echo 'Offset: ' . $articles['offset'];
  // Value like "itrJYSLx0RfslI80f/recEu6TiPTPCSDxg5" may exist.
  // If so, go back to start, do get_airtable_records($offset) again and array_push
  // Until, once more there is no "offset" value at end

我推测某种while循环会很有用...?

有些事情是真的...

  • 在第一次调用中,因为它从记录0开始,所以不需要传递原始offset值。
  • 但是该过程和随后的遍历可能会生成一个offset值,该值应用于进行另一遍遍。
  • final 调用将不会生成offset值,因为它将返回用尽结果的最后一页,因此无需重新开始。

1 个答案:

答案 0 :(得分:0)

主要感谢@anthony's answer to a similar question here,我似乎有一些有效的代码...

  // Prepare Article URLs list as an array
  $article_urls = array();

  // Call Airtable records in pages of 100 max
  do {

        // Offset is either inherited from last page's results, or is nothing
        $offset = $articles['offset'] ?: "";

        // Make get request, store result in array
        $articles = get_airtable_records($offset);

        // For each URL found in Airtable
        foreach($articles['records'] as $record){
           $url = $record['fields']['Published url'];
           // Add to our array list
           if (!empty($url)) {
              array_push($article_urls, $url);
           }
        }

  } while(!empty($articles['offset'])); // If there's an offset value (ie. starting record of next page), do again

  // Output URL list for check
  echo '<pre>';
  print_r($article_urls);
  echo '</pre>';

解释似乎是:

使用do while循环。 首先,将offset设置为从上一次运行继承的值,或者不设置任何值。

我的get_airtable_records函数已经在API调用中限制了offset的存在,以下操作将offset查询字符串添加到下一个API调用的URL中如果有的话...

  if (!empty($offset)) {
    $q_offset = '&offset='.$offset;
  }

我已经对此进行了测试,它从两页的$article_urls数组中获得了全部137个结果。我没有用超过两页的结果进行测试。