Я тяну через 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()
представленное в другом месте на этом сайте.