Как сделать зацикленные вызовы функций для нумерации страниц? - PullRequest
0 голосов
/ 17 января 2019

Я пытаюсь использовать Airtable API для извлечения записей из моих данных, в частности, списка URL-адресов, которые у меня есть в ячейках столбцов.

Я написал функцию get_airtable_records для выполнения вызова API через curl, и она работает - возвращая результаты в виде объекта Json. В частности, я помещаю URL-адреса в массив, $article_urls.

Единственная проблема в том, что Airtable ограничивает возврат результатов «страницами» максимум 100 записей, а мои данные содержат больше этого. API принимает параметры maxRecords и pageSize, но более важный, pageSize, по-прежнему ограничен 100.

Airtable также возвращает другое значение Json, offset, которое используется в таких случаях для нумерации страниц. offset - это идентификатор записи, предназначенный для использования в качестве входного параметра (также называемый offset). Вы можете использовать его для обозначения начальной записи в последующем дополнительном вызове API. Я понимаю это .

Чего я не понимаю, так это как изменить мой код, чтобы учесть возможность повторного опроса Airtable.

Другими словами, мы всегда должны делать стартовый запуск с нуля, когда нет значения offset. Затем, если в возвращаемых результатах присутствует значение offset, мы должны снова обойти - пока значение offset не появится.

Вот что у меня есть.

<code>  // 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 '
'; // Может достигнуть максимума 100 // echo 'Offset:'. $ статьи [ 'смещение']; // Может существовать значение типа "itrJYSLx0RfslI80f / recEu6TiPTPCSDxg5". // Если это так, вернитесь к началу, снова выполните get_airtable_records ($ offset) и array_push // До тех пор, пока еще раз нет значения "смещение" в конце

Я предполагаю, что какой-то цикл while будет полезен ...?

Пара вещей верна ...

  • При первом вызове исходное значение offset не нужно передавать, поскольку оно начинается с записи 0.
  • Но этот и последующие проходы могут генерировать значение offset, которое следует использовать для следующего прохода.
  • Вызов final не будет генерировать значение offset, так как он вернет последнюю страницу исчерпанных результатов, и нет необходимости начинать заново.

1 Ответ

0 голосов
/ 17 января 2019

В значительной степени благодаря @ ответу Энтони на подобный вопрос здесь , у меня, кажется, есть некоторый рабочий код ...

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

Объяснение выглядит так:

Используйте цикл do while. В начале этого установите offset как значение, унаследованное от предыдущего запуска, или ничего.

Моя get_airtable_records функция уже ограничивала присутствие или отсутствие offset в вызове API следующим образом, который добавляет строку запроса offset в URL для следующего вызова API, если таковой имеется. .

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

Я проверил это, и он дал мне все 137 результатов с двух страниц в мой массив $article_urls. Я не тестировал его с более чем двумя страницами результатов.

...