在php中管理限制和偏移量

时间:2015-06-05 07:42:02

标签: php limit offset musicbrainz

我目前正在开发一个可以找到艺术家及其同事头衔的网络应用程序。为此,我决定通过this package解析API MusicBrainz(文档为here)。

假设我已经拥有了艺术家mbid(MusicBrainz的唯一标识符)。

问题在于,如果我在David Guetta(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和100之间的结果196(在本例中)。

2 个答案:

答案 0 :(得分:2)

this question开始,我会将我的回答发布为"真正的答案":

<强> 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);
}

答案 1 :(得分:1)

来自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,因为所需的rate limiting似乎没有在PHP库中实现。