如何正确使用array_unique来回显一次相同的帖子

时间:2011-07-12 11:24:54

标签: php arrays array-unique

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

我只收到一个帖子。

如何才能正确显示帖子一次?谢谢。

2 个答案:

答案 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>";
}