Как правильно использовать array_unique для вывода только одного и того же сообщения - PullRequest
1 голос
/ 12 июля 2011

Я пытаюсь отобразить сообщения некоторых 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')));

У меня отображается только одно сообщение.

Как правильно отобразить сообщения только один раз?Спасибо.

Ответы [ 2 ]

0 голосов
/ 12 июля 2011

Обновление:

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>";
} 
0 голосов
/ 12 июля 2011

Из документации array_unique

Примечание: два элемента считаются равными тогда и только тогда, когда (строка) $ elem1 === (строка) $ 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 в любом случае сравниваться одинаково. Но попробуйте и дайте мне знать. Я могу сделать что-то еще, если это не поможет.

...