我试图显示一些RSS提要的帖子,我提出了一个问题/问题,我有,当我有两个相同的提要我试图显示不是所有的帖子,但唯一的。我使用的是这个,它显示了我所有的帖子两次(这是逻辑的)
<?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')));
我只看到一个帖子。
我怎样才能正确地只显示一次帖子?谢谢你。
更新:
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>";
}
摘自array_unique
的文档
注意:两个元素相等当且仅当(string) $elem1=== (string) $elem2。换句话说:当字符串表示相同时。第一个元素将被使用。
在这种情况下,您从XPath查询中得到的对象转换为字符串形式,如"SimpleXML对象"(不完全是这样,但确切的表示并不重要)。根据上述规则,每个元素看起来与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文档的相同节点会比较相同的。试试吧,然后告诉我。如果这个不行的话,我可以做其他的