Сортировка OPML с помощью Simplexml
Я прочитал несколько постов здесь, но я все еще не могу понять, как сортировать данные, которые я читаю, из файла OPML, используя функции simplexml. Я понимаю, что это своего рода дубликат, но я, кажется, слишком медленен, чтобы сделать это правильно, используя абстрактные примеры.
У меня есть довольно стандартный файл 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);
Но я не могу понять, правильно ли сортировать этот массив по "заголовку"
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";
}