XML Feeds & PHP – ограничение количества элементов

Я тяну через BBC News XML Feed. Но я хочу ограничить это, чтобы сказать 8 или 10 пунктов фида.

Как я могу это достичь?

Мой код:

<?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 } ?> 

Заранее спасибо..

Возьмите переменную счетчика, увеличивайте на единицу с каждой итерацией и проверьте, достигнут ли счетчик на верхнем пределе, а затем выйдите из цикла.

 $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 } ?> 

Используя 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 ); } 

Вы немного легче, обмениваясь объектом DOM с помощью объекта SimpleXML и 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) { // ... } 

Когда вы делаете это с помощью 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() представленное в другом месте на этом сайте.