2013-12-19 67 views
0

我已經閱讀了一堆帖子,但仍然無法弄清楚如何使用simplexml函數對OPML文件中的數據進行排序。我意識到這是一種重複的,但我顯然太慢,無法使用抽象的例子來正確使用它。使用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> 

我用盡可能簡單的代碼生成降價列表:

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

我只是想作爲排序依據的列表「title」屬性,但我無法理解如何去做。

這是我的理解,我需要的XML對象轉換成數組,我可以這樣做:

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

但我似乎無法得到正確的事情由「標題」到數組排序

回答

0

而不是試圖盲目整個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"; 
}