1

いくつかの RSS フィードの投稿を表示しようとしていますが、同じフィードが 2 つあるときに、すべての投稿ではなく一意の投稿を表示しようとしているときに、質問/問題が発生しました。私が使用していたのはこれで、すべての投稿が2回表示されます(これは論理的です)

 <?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')));

表示される投稿は 1 つだけです。

投稿を一度だけ正しく表示するにはどうすればよいですか? ありがとうございました。

4

2 に答える 2

0

のドキュメントからarray_unique

注: (文字列) $elem1 === (文字列) $elem2 の場合に限り、2 つの要素は等しいと見なされます。つまり、文字列表現が同じ場合です。最初の要素が使用されます。

この場合、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 に答える