我有一些可以返回大量数据的代码。因此,我没有将其保存到数组中,而是想使用生成器。但是,我遇到了很多问题。
现在,当我像这样简单地做这件事时
foreach ($this->test(0,10) as $test) {
print $test;
}
public function test($from, $to) {
for ($i = $from; $i < $to; $i++) {
yield $i;
}
}
我在这里得到以下输出
0123456789
现在,我想以现实生活中的例子来做同样的事情。喜欢这个
$posts = $this->getPosts();
foreach ($posts as $post) {
print $post;
}
protected function getPosts()
{
// Getting the content of the sitemap
$response = Curl::get('http://wpde.org/sitemap.xml')[0];
// Loading the string as XML
$sitemapJson = simplexml_load_string($response->getContent());
// This case is true when the sitemap has a link to more sitemaps instead of linking directly to the posts
if (isset($sitemapJson->sitemap)) {
foreach ($sitemapJson->sitemap as $post) {
if (substr($post->loc, -3) === "xml") {
$this->setUrl((string)$post->loc);
yield $this->getPosts(); // I also tried it here without the yield, but then I just get an empty output :/
}
}
}
// This case is true, when the sitemap has now the direct links to the post
elseif (isset($sitemapJson->url)) {
foreach ($sitemapJson->url as $url) {
yield (string)$url->loc;
}
}
}
但是我在这里得到错误:
捕获致命错误:类Generator的对象无法转换为字符串
奇怪的是,当我打印出网址时
print $this->url . '<br>';
我只获取Sitemap的第一个网址。但是,如果我删除了yield
部分,我将获取Sitemap的所有链接。看起来它似乎不知何故停在那里?
无论如何,我只是无法打印出数据。我该怎么做?谢谢!
如果没有第一个案例中的收益,那么根本没有内容。
答案 0 :(得分:3)
更改此行
yield $this->getPosts();
到
foreach($this->getPosts() as $post)
yield $post;
仅作为一个项目,而不是整个&#34;集合&#34;可能会立刻咆哮。