【问题标题】:Can't figure out a for loop with an RSS feed无法找出带有 RSS 提要的 for 循环
【发布时间】:2012-12-08 16:58:44
【问题描述】:

我正在尝试提取 RSS 提要,但我只想显示其中一项 - 一个随机数 - 而不是全部。我已经使用 for 循环设置了一个测试,但似乎无法让它工作。我来自 JS 背景。任何帮助或提示将不胜感激!

<?php

$url = "http://abc.net.au/bestof/bestofabc.xml";

$rss = simplexml_load_file($url);

if ($rss) {

    $items = $rss->channel->item;

    for ($i = 0; $i < count($items); $i++){

        if ($i == 2) {

            echo($items[$i]); // doesn't show anything
        }
    }
}

?>

【问题讨论】:

  • 你试过var_dump($rss-&gt;channel-&gt;item);die;吗?
  • 您在$item 中获得了什么价值?
  • $item 是 RSS 对象中的一个条目,如果我不指定索引 - 我将得到所有原始数据的回显。只是似乎无法根据索引限制它。
  • 我们可以确定count($items) &gt; 2吗?

标签: php arrays for-loop rss


【解决方案1】:

这里基本上有两个选项,为了方便使用,我首先将项目分配给它自己的变量:

$item = $items[$i];

然后是调试的两个选项:

var_dump($item);
echo $item->asXML();

第一行将创建一个var_dump,它是 PHP 的,在这种情况下甚至是 SimpleXML 特定的:

class SimpleXMLElement#193 (5) {
  public $title =>
  string(29) "Asylum seeker system overload"
  public $link =>
  string(29) "http://www.abc.net.au/bestof/"
  public $description =>
  class SimpleXMLElement#287 (0) {
  }
  public $pubDate =>
  string(31) "Thu, 22 Nov 2012 00:00:00 +1100"
  public $guid =>
  string(8) "s3638457"
}

第二行将创建一些我敢打赌对你来说很常见的东西,即 XML 本身:

<item>
            <title>Asylum seeker system overload</title>
            <link>http://www.abc.net.au/bestof/</link>
            <description><![CDATA[
            <img style="float:right;" src="http://www.abc.net.au/common/images/news_asylum125.jpg" alt="Asylum seeker detainees (ABC News)">
            <p>The Australian government is preparing to allow thousands of asylum seekers to love in the community.</p>
            <ul>

                <li><a href="http://mpegmedia.abc.net.au/news/lateline/video/201211/LATc_FedNauru_2111_512k.mp4">Watch (4:23)</a></li><li><a href="http://www.abc.net.au/lateline/content/2012/s3638174.htm">More - Lateline</a></li>
            </ul>
            ]]></description>

            <pubDate>Thu, 22 Nov 2012 00:00:00 +1100</pubDate>
            <guid isPermaLink="false">s3638457</guid>
        </item>

您没有看到任何输出:

echo $items[$i];

因为&lt;item&gt; 元素没有值,只有子元素。例如

echo $items[$i]->title;

将输出字符串:

Asylum seeker system overload

我希望这对您有所帮助并有所启发。你找到demo here,也说明你可以使用foreach

$i = 0;
foreach ($rss->channel->item as $item)
{
    if ($i++ == 2) {
        var_dump($item);
        echo $item->asXML(), "\n", $item->title;
    }
}

【讨论】:

  • 非常感谢您抽出宝贵时间帮助我!真的很感激 - 这完美地回答了我的问题:)
【解决方案2】:

我真的建议你使用xpath从所有渠道加载所有项目,然后随机选择项目。这是示例代码,根据需要进行优化...

$url = "http://abc.net.au/bestof/bestofabc.xml";
$rss = @simplexml_load_file($url);
// get all the items in all channels
$items = $rss->xpath('//rss/channel/item');
// randomly dump one of the items from loaded list
$k = array_rand($items);
var_dump($items[$k]);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-11-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-03-02
    相关资源
    最近更新 更多