1

我正在尝试显示一些 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')));

我只显示一个帖子。

我怎样才能正确地只显示一次帖子?谢谢你。

4

2 回答 2

0

从文档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 文档的相同节点无论如何都会比较相同。但是试试看,让我知道。如果这不起作用,我可以鞭打其他东西。

于 2011-07-12T11:36:41.597 回答
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>";
} 
于 2011-07-12T12:06:49.573 回答