我正在尝试显示一些RSS Feed的帖子,我想出了一个问题/问题,当我有两个相同的Feed时,我试图显示的不是所有帖子而是唯一的。我使用的是这个,它向我显示了两次所有帖子(这是合乎逻辑的)
<?php
$feeds = array(
'feed.xml', 'feed.xml'
);
// Get all feed entries
$entries = array();
foreach ($feeds as $feed) {
$xml = simplexml_load_file($feed);
$entries = array_merge($entries, $xml->xpath('/rss/channel//item'));
}
// Sort feed entries by pubDate (ascending)
usort($entries, 'mysort');
function mysort($x, $y) {
return strtotime($y->pubDate) - strtotime($x->pubDate);
}
foreach ($entries as $entry) {
echo $entry->title;
echo "<br>";
}
?>
但当我将该行更改为
时 $entries = array_unique(array_merge($entries, $xml->xpath('/rss/channel//item')));
我只收到一个帖子。
如何才能正确显示帖子一次?谢谢。
答案 0 :(得分:0)
来自array_unique
注意:当且仅当(字符串)$ elem1时,两个元素被认为是相等的 ===(字符串)$ elem2。用文字表示:当字符串表示相同时。将使用第一个元素。
在这种情况下,您从XPath查询中获取的对象转换为字符串形式,如“SimpleXML object”(不完全相同,但确切的表示并不重要)。根据上述规则,每个元素看起来与array_unique
完全相同。
不幸的是,没有办法让array_unique
按照你想要的方式行事,所以你需要自己假装:
$feeds = array(
'myfeed.xml', 'myfeed.xml'
);
// Get all feed entries
$entries = array();
foreach ($feeds as $feed) {
$xml = simplexml_load_file($feed);
$tmp = $xml->xpath('/rss/channel//item');
foreach ($tmp as $item) {
if(!in_array($tmp, $entries)) {
$entries[] = $tmp;
}
}
}
我不确定这是否可行,因为它取决于能够比较对象,而且我不知道来自单独的XML文档的相同节点无论如何都会比较相同的节点。但试试吧,让我知道。如果这不起作用,我可以鞭打别的东西。
答案 1 :(得分:0)
更新
function mysort($x, $y) {
return strtotime($y->pubDate) - strtotime($x->pubDate);
}
$feeds = array( 'http://feeds.bbci.co.uk/news/world/rss.xml',
'http://feeds.bbci.co.uk/news/world/rss.xml'
);
// Get all feed entries
$entries = array();
foreach ($feeds as $feed) {
$xml = simplexml_load_file($feed);
$entries = array_merge($entries, $xml->xpath('/rss/channel//item'));
}
$uniqueEntries = array();
foreach ($entries as $entry) {
$uniqueEntries[(string)$entry->title] = $entry;
}
// Sort feed entries by pubDate (ascending)
usort($entries, 'mysort');
foreach ($uniqueEntries as $entry) {
echo $entry->title;
echo "<br>";
}