2011-10-24 62 views
1

我正在瀏覽BBC News XML Feed。但我想要做的就是限制它說8或10個飼料項目。XML Feeds&PHP - 限制項目數

我該如何做到這一點?

我的代碼是:

<?php 

    $doc = new DOMDocument(); 
    $doc->load('http://feeds.bbci.co.uk/news/rss.xml'); 
    $arrFeeds = array(); 
    foreach ($doc->getElementsByTagName('item') as $node) { 
    $itemRSS = array ( 
     'title' => $node->getElementsByTagName('title')->item(0)->nodeValue, 
     'desc' => $node->getElementsByTagName('description')->item(0)->nodeValue, 
     'link' => $node->getElementsByTagName('link')->item(0)->nodeValue, 
     'date' => $node->getElementsByTagName('pubDate')->item(0)->nodeValue 
    ); 
?> 

<h2><a href="<?php echo $itemRSS['link'] ;?>"><?php echo $itemRSS['title']; ?></a></h2> 
<?php } ?> 

在此先感謝..

回答

5

以一個計數器變量,增量由一個與每個迭代,並檢查是否在上限達到計數器,然後退出循環。

$cnt=0; 
foreach ($doc->getElementsByTagName('item') as $node) { 
    if($cnt == 8) { 
     break; 
    }  
    $itemRSS = array ( 
     'title' => $node->getElementsByTagName('title')->item(0)->nodeValue, 
     'desc' => $node->getElementsByTagName('description')->item(0)->nodeValue, 
     'link' => $node->getElementsByTagName('link')->item(0)->nodeValue, 
     'date' => $node->getElementsByTagName('pubDate')->item(0)->nodeValue 
    ); 
     $cnt++; 
?>  
<h2><a href="<?php echo $itemRSS['link'] ;?>"><?php echo $itemRSS['title']; ?></a></h2> 
<?php 
} ?> 
+0

這不會得到9,因爲你是從0開始,並在底部增加? –

+0

@RyanMatthews:是的,沒錯。我只是舉了一個例子來說明它是如何完成的。 –

+0

@ShaktiSingh謝謝你,作品一種享受。我正在查看一個計數變量,只是在錯誤的地方..完美的答案,謝謝。 – StuBlackett

7

使用XPath,您可以輕鬆地檢索RSS提要的子集。

$itemCount = 10; 
$xml = simplexml_load_file('http://feeds.bbci.co.uk/news/rss.xml'); 
$items = $xml->xpath(sprintf('/rss/channel/item[position() <= %d]', $itemCount)); 
foreach ($items as $i) { 
    $itemRSS = array ( 
     'title' => (string)$i->title, 
     'desc' => (string)$i->description, 
     'link' => (string)$i->link, 
     'date' => (string)$i->pubDate 
    ); 
} 

你是一個小更輕便,通過一個SimpleXML對象交換DOM對象 - 和XPath是容易得多SimpleXML使用(這就是爲什麼我在這個例子中使用它)。這也可以用DOM實現這樣的:

$doc = new DOMDocument(); 
$doc->load('http://feeds.bbci.co.uk/news/rss.xml'); 
$xpath = new DOMXpath($doc); 
$items = $xpath->query(sprintf('/rss/channel/item[position() <= %d]', $itemCount)); 
foreach ($items as $i) { 
    // ... 
} 
+0

我喜歡這種方法,將來無疑會使用它。非常感謝! – StuBlackett

2

當你與SimpleXml做到這一點,你也可以使用array_slice

$rss = simplexml_load_file('http://feeds.bbci.co.uk/news/rss.xml'); 
$items = $rss->xpath('/rss/channel/item'); 
$startAtItem = 0; 
$numberOfItems = 9; 
$firstTenItems = array_slice($items, $startAtItem, $numberOfItems); 

或者用LimitIterator

$rss = simplexml_load_file('http://feeds.bbci.co.uk/news/rss.xml'); 
$items = $rss->xpath('/rss/channel/item'); 
$startAtItem = 0; 
$numberOfItems = 9; 
$firstTenItems = new LimitIterator(
    new ArrayIterator($items), $startAtItem, $numberOfItems 
); 
foreach ($firstTenItems as $item) { … 

更多優雅的是XPath position()解決方案呈現在本網站的其他地方。