elliotchance / iterator
PHP 的迭代器构建器
v1.1.0
2017-11-09 22:25 UTC
Requires (Dev)
- elliotchance/concise: ~1.7
- phpunit/phpunit: ~4.0
This package is not auto-updated.
Last update: 2024-09-24 08:41:09 UTC
README
PHP 的迭代器构建器。
use Elliotchance\Iterator\AbstractPagedIterator; class MyPagedIterator extends AbstractPagedIterator { /** * The total number of items we expect to find. The last page may be partial. * @return integer */ public function getTotalSize() { return 8; } /** * The number of items per page. All pages must be the same size (except the * last page). * @return integer */ public function getPageSize() { return 3; } /** * Lazy-load a specific page. * @return array */ public function getPage($pageNumber) { $pages = [ [ 1, 2, 3 ], [ 4, 5, 6 ], [ 7, 8 ], ]; return $pages[$pageNumber]; } }
现在您可以像操作数组一样操作它
$iterator = new MyPagedIterator(); echo $iterator[4]; // 5 foreach ($iterator as $item) { echo $item; } // 1 2 3 4 5 6 7 8 9
需要注意的是,在第一次访问后,页面会被内部缓存。这使得它非常适合那些无论请求的项的顺序如何,每页只进行一次 API 请求的 API
use Elliotchance\Iterator\AbstractPagedIterator; class GithubSearcher extends AbstractPagedIterator { protected $totalSize = 0; protected $searchTerm; public function __construct($searchTerm) { $this->searchTerm = $searchTerm; // this will make sure totalSize is set before we try and access the data $this->getPage(0); } public function getTotalSize() { return $this->totalSize; } public function getPageSize() { return 100; } public function getPage($pageNumber) { $url = "https://api.github.com/search/repositories?" . http_build_query([ 'q' => 'fridge', 'page' => $pageNumber + 1 ]); $result = json_decode(file_get_contents($url), true); $this->totalSize = $result['total_count']; return $result['items']; } } $repositories = new GithubSearcher('fridge'); echo "Found " . count($repositories) . " results:\n"; foreach ($repositories as $repo) { echo $repo['full_name']; }