在 php 中使用限制和偏移量进行管理
Manage with limit and offset in php
我目前正在开发一个 web 应用程序,可以找到艺术家和他们的同事的头衔。为此,我决定通过 this package (which documentation is here).
解析 API MusicBrainz
假设我已经有了艺术家 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
);
}
现在我们在 post.
中讨论我的真正问题
如果我为第一个查询定义了 $limit = 100
和 $offset = 0
,我不明白如何根据总发布数更改这些值,从而得到介于两者之间的结果100 和 196(在本例中)。
从 this question 开始,我将 post 我的回答 "real answer":
伪语言
给定: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);
}
来自 的伪代码答案是正确的,但这是您必须修改代码以使其工作的方式。
$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 库中实现。
我目前正在开发一个 web 应用程序,可以找到艺术家和他们的同事的头衔。为此,我决定通过 this package (which documentation is here).
解析 API MusicBrainz假设我已经有了艺术家 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
);
}
现在我们在 post.
中讨论我的真正问题如果我为第一个查询定义了 $limit = 100
和 $offset = 0
,我不明白如何根据总发布数更改这些值,从而得到介于两者之间的结果100 和 196(在本例中)。
从 this question 开始,我将 post 我的回答 "real answer":
伪语言
给定: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);
}
来自
$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 库中实现。