【问题标题】:Sort OPML with simplexml使用 simplexml 对 OPML 进行排序
【发布时间】:2013-12-19 20:27:11
【问题描述】:

我在这里阅读了一堆帖子,但我仍然不知道如何使用 simplexml 函数对从 OPML 文件中读取的数据进行排序。我意识到这是一种重复,但我显然太慢了,无法使用抽象的例子来正确地做到这一点。

我有一个非常标准的 OPML 文件,其内容如下:

<?xml version="1.0" encoding="UTF-8"?>
<opml version="1.0">
<!-- OPML generated by Fever -->
<head><title>Fever // Coffee</title></head>
<body>    
    <outline type="rss" text="I Love Coffee" title="I Love Coffee" xmlUrl="http://en.ilovecoffee.jp/posts/rss" htmlUrl="http://www.ilovecoffee.jp"/>
    <outline type="rss" text="Dear Coffee I Love You" title="Dear Coffee I Love You" xmlUrl="http://feeds.feedburner.com/DearCoffeeILoveYou" htmlUrl="http://www.dearcoffeeiloveyou.com"/>
</body>
</opml>

我正在使用最简单的代码生成一个 Markdown 列表:

foreach ($opml->body->outline as $feed) {
    echo '* [' . $feed['title'] . '](' . $feed[htmlUrl] . ')' . "\n";
}

我只是想按“title”属性对列表进行排序,但我不知道该怎么做。

据我了解,我需要将 xml 对象转换为数组,我可以这样做:

$json = json_encode($opml);
$xml_array = json_decode($json,TRUE);

但我似乎无法按“标题”对该数组进行排序

【问题讨论】:

    标签: php simplexml opml


    【解决方案1】:

    与其试图盲目地将整个 XML 文档转换为一个数组(这很少是一个特别有用的数组),不如构建一个包含所需项目的数组:

    $feed_list = array();
    foreach ($opml->body->outline as $feed) {
         $feed_list[] = $feed;
    }
    

    然后您可以使用usort() 按您想要的任何条件对项目进行排序,例如使用strcasecmp() 给出不区分大小写的字母数字顺序:

    usort($feed_list, function($a, $b) {
         // $a and $b are SimpleXMLElement objects which are being sorted
         return strcasecmp( (string)$a['title'], (string)$b['title'] );
    });
    

    您现在有一个排序数组可以传递给您现有的显示逻辑:

    foreach ( $feed_list as $feed ) {
        echo '* [' . $feed['title'] . '](' . $feed['htmlUrl'] . ')' . "\n";
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-03-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多