Управление с лимитом и смещением в php

В настоящее время я занимаюсь разработкой веб-приложения, в котором можно найти имена художников и их коллег. Для этого я решил проанализировать API MusicBrainz через этот пакет (документация здесь).

Предположим, у меня уже есть художник mbid (уникальный идентификатор для MusicBrainz).

Проблема в том, что если я сделаю поиск на Дэвида Гетта (mbid = 302bd7b9-d012-4360-897a-93b00c855680) например, скрипт сообщает мне, что количество выпусков составляет 196. Однако API предоставляет 100 максимальных результатов на запрос.

// Instantiate a MusicBrainz object
$brainz = new MusicBrainz(new GuzzleHttpAdapter(new Client()));
$brainz->setUserAgent('ApplicationName', '0.2', 'http://example.com');

$limit = 100;
$offset = 0;

$includes = array('labels', 'recordings');
try {
  $details = $brainz->browseRelease('artist', '302bd7b9-d012-4360-897a-93b00c855680', $includes, $limit, $offset);
  print_r($details);
} catch (Exception $e) {
  print $e->getMessage();
}

Функция browseRelease ниже позволяет нам определить такие параметры как limit а также offset,

public function browseRelease($entity, $mbid, $includes = array(), $limit = 25, $offset = null, $releaseType = array(), $releaseStatus = array())
{
  if (!in_array($entity, array('artist', 'label', 'recording', 'release-group'))) {
    throw new Exception('Invalid browse entity for release');
  }
  return $this->browse(
    new Filters\ReleaseFilter(array()),
      $entity,
      $mbid,
      $includes,
      $limit,
      $offset,
      $releaseType,
      $releaseStatus
  );
}

Теперь мы подошли к моему настоящему вопросу в этом посте.

Если бы я определил $limit = 100 а также $offset = 0 для первого запроса я не понимаю, как изменить эти значения в зависимости от общего количества выпусков и, таким образом, получить результаты от 100 до 196 (в этом примере).

2 ответа

Решение

Ответ псевдокода от Jordumus правильный, но именно так вы должны изменить свой код, чтобы он работал.

$limit = 100;
$offset = 0;
$release_count = 0;

$includes = array('labels', 'recordings');
do {
  if ($offset != 0) sleep(1);
  try {
    $details = $brainz->browseRelease('artist', '302bd7b9-d012-4360-897a-93b00c855680', $includes, $limit, $offset);
    $release_count = $details['release-count'];
    print_r($details);
  } catch (Exception $e) {
    print $e->getMessage();
  }
  $offset += $limit;
} while ($offset < $release_count);

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

Я добавил sleep там из-за требуемого ограничения скорости, которое, кажется, не реализовано в библиотеке PHP.

На этот вопрос я опубликую свой ответ как "реальный ответ":

Pseudolanguage

Дано: 150 результатов. Вы можете определить: смещение и предел. Но: максимальный предел составляет 100 результатов.

Вам нужно 2 звонка, потому что вы можете получить только 100 результатов одновременно. Вот как вы могли бы решить это:

Звоните 1:

Offset: 0
Limit: 100
//Returns results 0 to 99.

Звоните 2:

Offset: 100
Limit: [OPTIONAL] 100
//Returns resuls 100 to 199. As there are only 150 results in total, it will automatically return 100 to 150

Теперь мы можем сделать это автоматически с помощью цикла:

limit = 100
for (var i = 0; i < maxResults; i=i+100)
{
    offset = i
    GetResults(offset,limit);
}
Другие вопросы по тегам