PHP 按日期订购多个 RSS 提要
PHP order multiple RSS feeds by date
我有一些 PHP 代码可以合并两个 RSS 提要。我试图按日期对提要进行排序,但我得到了一个有趣的结果:
两个提要分别排序(第一个提要列在最前面,然后
第二次进纸)
第一个提要按升序排序,第二个提要按降序排序。
我希望所有数据(一起馈送 1 + 2)按日期排序,最新的项目排在最前面。非常感谢任何帮助!
这是我的代码(usort
和 foreach
在底部循环):
<?php
class Feed_Miro
{
public $urls = array();
public $data = array();
public function addFeeds( array $feeds )
{
$this->urls = array_merge( $this->urls, array_values($feeds) );
}
public function grabRss()
{
foreach ( $this->urls as $feed )
{
$data = @new SimpleXMLElement( $feed, 0, true );
if ( !$data )
throw new Exception( 'Could not load: ' . $feed );
foreach ( $data->channel->item as $item )
{
$this->data[] = $item;
}
}
}
public function merge_feeds(){
$temp = array();
foreach ( $this->data as $item )
{
if ( !in_array($item->link, $this->links($temp)) )
{
$temp[] = $item;
}
} $this->data = $temp;
}
private function links( array $items ){
$links = array();
foreach ( $items as $item )
{
$links[] = $item->link;
}
return $links;
}
}
/*********
add urls
*********/
$urls = array( 'http://www.voyagersfamily.ch/feed.xml', 'http://www.miroman.ch/feed.xml' );
try
{
$feeds = new Feed_Miro;
$feeds->addFeeds( $urls );
$feeds->grabRss();
$feeds->merge_feeds();
}
catch ( exception $e )
{
die( $e->getMessage() );
}
// test from here
$data = array();
$data = $feeds -> data;
usort($data, function($a,$b){
return $a->pubDate - $b->pubDate;
});
foreach ( $data as $item ) :
//foreach ( $feeds->data as $item ) :
extract( (array) $item );
?>
<div class="span4 profile">
<h3 class="profile-description"><a href="<?php echo $link; ?>" style="text-decoration:none;"><?php echo $title; ?></a></h3>
<p class="profile-description"><?php echo $description; ?><br>
published: <?php echo $pubDate; ?> <a href="<?php echo $link ?>" target="_blank">more</a></p>
</div>
<?php endforeach; ?>
您正在比较字符串,而您需要比较例如时间戳
这部分:
usort($data, function($a,$b){
return $a->pubDate - $b->pubDate;
});
需要转换成时间戳比较如下:
usort($data, function($a,$b){
return strtotime($a->pubDate) - strtotime($b->pubDate);
});
例如:
$arr = [
['pubDate' => 'Wed, 07 Nov 2012 10:15:00 GMT',],
['pubDate' => 'Thu, 23 Feb 2017 09:00:00 GMT', ],
['pubDate' => 'Mon, 30 May 2016 10:00:00 GMT', ]
];
usort($arr, function($a, $b) {
return strtotime($a['pubDate']) > strtotime($b['pubDate']);
});
print_r($arr);
这将 return 为:
Array (
[0] => Array (
[pubDate] => Wed, 07 Nov 2012 10:15:00 GMT
)
[1] => Array (
[pubDate] => Mon, 30 May 2016 10:00:00 GMT
)
[2] => Array (
[pubDate] => Thu, 23 Feb 2017 09:00:00 GMT
)
)
在不转换为时间戳的情况下对数组进行排序时不会对其进行排序
我有一些 PHP 代码可以合并两个 RSS 提要。我试图按日期对提要进行排序,但我得到了一个有趣的结果:
两个提要分别排序(第一个提要列在最前面,然后 第二次进纸)
第一个提要按升序排序,第二个提要按降序排序。
我希望所有数据(一起馈送 1 + 2)按日期排序,最新的项目排在最前面。非常感谢任何帮助!
这是我的代码(usort
和 foreach
在底部循环):
<?php
class Feed_Miro
{
public $urls = array();
public $data = array();
public function addFeeds( array $feeds )
{
$this->urls = array_merge( $this->urls, array_values($feeds) );
}
public function grabRss()
{
foreach ( $this->urls as $feed )
{
$data = @new SimpleXMLElement( $feed, 0, true );
if ( !$data )
throw new Exception( 'Could not load: ' . $feed );
foreach ( $data->channel->item as $item )
{
$this->data[] = $item;
}
}
}
public function merge_feeds(){
$temp = array();
foreach ( $this->data as $item )
{
if ( !in_array($item->link, $this->links($temp)) )
{
$temp[] = $item;
}
} $this->data = $temp;
}
private function links( array $items ){
$links = array();
foreach ( $items as $item )
{
$links[] = $item->link;
}
return $links;
}
}
/*********
add urls
*********/
$urls = array( 'http://www.voyagersfamily.ch/feed.xml', 'http://www.miroman.ch/feed.xml' );
try
{
$feeds = new Feed_Miro;
$feeds->addFeeds( $urls );
$feeds->grabRss();
$feeds->merge_feeds();
}
catch ( exception $e )
{
die( $e->getMessage() );
}
// test from here
$data = array();
$data = $feeds -> data;
usort($data, function($a,$b){
return $a->pubDate - $b->pubDate;
});
foreach ( $data as $item ) :
//foreach ( $feeds->data as $item ) :
extract( (array) $item );
?>
<div class="span4 profile">
<h3 class="profile-description"><a href="<?php echo $link; ?>" style="text-decoration:none;"><?php echo $title; ?></a></h3>
<p class="profile-description"><?php echo $description; ?><br>
published: <?php echo $pubDate; ?> <a href="<?php echo $link ?>" target="_blank">more</a></p>
</div>
<?php endforeach; ?>
您正在比较字符串,而您需要比较例如时间戳
这部分:
usort($data, function($a,$b){
return $a->pubDate - $b->pubDate;
});
需要转换成时间戳比较如下:
usort($data, function($a,$b){
return strtotime($a->pubDate) - strtotime($b->pubDate);
});
例如:
$arr = [
['pubDate' => 'Wed, 07 Nov 2012 10:15:00 GMT',],
['pubDate' => 'Thu, 23 Feb 2017 09:00:00 GMT', ],
['pubDate' => 'Mon, 30 May 2016 10:00:00 GMT', ]
];
usort($arr, function($a, $b) {
return strtotime($a['pubDate']) > strtotime($b['pubDate']);
});
print_r($arr);
这将 return 为:
Array (
[0] => Array (
[pubDate] => Wed, 07 Nov 2012 10:15:00 GMT
)
[1] => Array (
[pubDate] => Mon, 30 May 2016 10:00:00 GMT
)
[2] => Array (
[pubDate] => Thu, 23 Feb 2017 09:00:00 GMT
)
)
在不转换为时间戳的情况下对数组进行排序时不会对其进行排序