Les N fils RSS sont récupérés puis il sont fusionnés en respectant l'ordre des dates de publications. Ce code est une amélioration de celui trouvé sur le site suivant : http://www.arikfr.com/blog/handling-rss-feeds-in-php-using-zend_feed.html
<?php require_once 'Zend/Feed.php'; function loadFeed ($url) { try { $feed = Zend_Feed::import($url); } catch (Zend_Feed_Exception $e) { // feed import failed return null; } return $feed; } function getEntriesAsArray ($feed) { $entries = array(); foreach ($feed as $entry) { $date = $entry->pubDate(); if (!$date) { $date = $entry->{'dc:date'}; } $entries[] = array ( 'title' => $entry->title(), 'link' => $entry->link(), 'guid' => $entry->guid(), 'lastUpdate' => strtotime($date), 'description' => $entry->description(), 'pubDate' => $date, ); } return $entries; } function cmpEntries ($a , $b) { $a_time = $a['lastUpdate']; $b_time = $b['lastUpdate']; if ($a_time == $b_time) { return 0; } return ($a_time > $b_time) ? -1 : 1; } // liste de tous vos flux à fusionner $feed_urls = array('http://www.nexen.net/news/backend.2.rss', 'http://www.unixgarden.com/index.php/feed', 'http://rss.slashdot.org/Slashdot/slashdot'); $feeds = array(); foreach($feed_urls as $k => $url) { $feeds[$k] = loadFeed($url); } $merged_feed = array ( 'title' => 'Titre de votre flux résultat', 'link' => 'http://url-de-votre-flux/', 'charset' => 'UTF-8', 'entries' => array(), ); foreach($feeds as $feed) { $merged_feed['entries'] = array_merge($merged_feed['entries'], getEntriesAsArray ($feed)); } usort ($merged_feed['entries'], 'cmpEntries'); $rssFeedFromArray = Zend_Feed::importArray($merged_feed, 'rss'); $rssFeedFromArray->send();
Discussion
Si on souhaite éviter de bloquer l'exécution du script lorsqu'un des site est indisponible, il faut attraper l'exception générée par Zend de cette façon :