在 PHP 中合并两个 RSS 提要

问题描述 投票:0回答:2

我使用以下代码在 PHP 中提取 RSS 提要。

$var = (array) simplexml_load_file($rssfeed);

一切都很好。 我能够循环遍历 RSS 提要,并在 $var 内对 RSS 提要进行我想要执行的所有处理。 问题是我希望能够将两个 RSS 提要合并在一起。

因此,我使用相同的代码从 simplexml_load_file 获取值,并使用

$items = $var->item;
提取项目,但我不知道如何合并两个 RSS 提要之间的项目子数组中的两个值。 我尝试过使用 array_merge、array_combine 并用加号将它们串在一起。 我最终得到第一个 RSS 提要或第二个 RSS 提要的值,但不是一组合并的值。

有人有什么想法吗(慢慢说,我是一名 DBA)。

蒂亚, 丹尼

php xml rss
2个回答
1
投票

尝试这样的方法,使用递归函数将整个 xml 对象转换为数组,数组合并是不够的,合并后你可以将其转换回对象。我认为问题是如果合并的两个 xml 文件具有相同的元素,它们可能会被合并覆盖。

function recursive_object_to_array($obj) {
if(is_object($obj)) $obj = (array) $obj;
if(is_array($obj)) {
    $new = array();
    foreach($obj as $key => $val) {
        $new[$key] = recursive_object_to_array($val);
    }
}
else $new = $obj;
return $new;
}

if (file_exists('test_folder/rss1.xml') && file_exists('test_folder/rss2.xml')) {

  $rss1 =  recursive_object_to_array(simplexml_load_file('test_folder/rss1.xml'));
  $rss2 =  recursive_object_to_array(simplexml_load_file('test_folder/rss2.xml'));
  $rss_combined = (object) array_merge((array) $rss1, (array) $rss2);

  var_dump($rss1);    //content of first rss file
  var_dump($rss2);    //content of second rss file
  var_dump($rss_combined); // contents when recombined as object

 //this is my best bet, since the array keys are the same for the example  i   used, you need to  create an associative array and loop over it. 

  $all_rss[1] = $rss1;
  $all_rss[2] = $rss2;

  var_dump($all_rss); // creates asscociative array on which to loop

} else {
  exit('Failed to open xml files.');
}

所以最终我会使用数组来访问元素。我在以下链接中使用了 xml 文件 RSS W3schools

    // get the xml
   $rss1 =  recursive_object_to_array(simplexml_load_file('test_folder/rss1.xml'));
   $rss2 =  recursive_object_to_array(simplexml_load_file('test_folder/rss2.xml'));

  // create assoaciative array
  $all_rss[1] = $rss1;
  $all_rss[2] = $rss2;
   // loop over array
  foreach($all_rss as $key=>$value){

      echo $value['channel']['title'];
      echo '</br></br>';
      echo $value['channel']['link'];
      echo '</br></br>';
   }

0
投票
<?php
    // Файл для кэширования данных из фида
    $cacheFile = 'cache.xml';
    // Время в минутах для обновления кэша
    $updateInterval = 60; // 60 минут
    // Проверка времени последнего обновления кэша
    if (file_exists($cacheFile) && time() - filemtime($cacheFile) < $updateInterval * 60) {
        // Использование кэшированных данных
        $feed = simplexml_load_file($cacheFile);
    } else {
        // Обновление кэша: загрузка данных из фида
        $feedUrls = array(
            'http://example.com/feed1.xml',
            'http://example.com/feed2.xml',
            'http://example.com/feed3.xml'
        );
        $news = array();
        foreach ($feedUrls as $url) {
            $feed = simplexml_load_file($url);
            foreach ($feed->channel->item as $item) {
                $news[(string)$item->pubDate] = $item;
            }
        }
        krsort($news);
        // Сохранение данных в кэш-файл
        $feed = new SimpleXMLElement('<rss version="2.0"></rss>');
        $channel = $feed->addChild('channel');
        foreach ($news as $item) {
            $newItem = $channel->addChild('item');
            $newItem->addChild('title', (string)$item->title);
            $newItem->addChild('description', (string)$item->description);
            $newItem->addChild('pubDate', (string)$item->pubDate);
            if (isset($item->enclosure)) {
                $enclosure = $newItem->addChild('enclosure');
                $enclosure->addAttribute('url', (string)$item->enclosure['url']);
                $enclosure->addAttribute('type', (string)$item->enclosure['type']);
            }
        }
        $feed->asXML($cacheFile);
    }
    // Вывод последних 16 новостей с изображениями
    $counter = 0;
    foreach ($feed->channel->item as $item) {
        if ($counter < 16) {
            echo "<h2>{$item->title}</h2>";
            echo "<p>{$item->description}</p>";
            echo "<p>Дата: {$item->pubDate}</p>";
            if (isset($item->enclosure)) {
                echo "<img src='{$item->enclosure['url']}' alt='Изображение'>";
            }
            echo "<a href='#'>Подробнее</a>";
            echo "<hr>";
            $counter++;
        } else {
            break;
        }
    }
?>
© www.soinside.com 2019 - 2024. All rights reserved.