ちょっと先の未来クイズ第4問

SimpleXML関数で取得したXML要素を逆順にしたい

お世話になります。
phpのsimplexml関数で取得したXML要素を
逆順にして表示させるにはどうしたらよいでしょうか?
通常、RSSなどを読み込み表示させた場合、新しいものから並ぶと思いますが、
これを逆順で古いほうから並ばせたいです。
rsortやarray_reverseを使ってみましたが、うまくいきませんでした。
よろしくお願いします。

A 回答 (4件)

生成したsimplexmlオブジェクト自体をソートしようとするから


出来ないんじゃないでしょうか。
simplexmlオブジェクトでパースしたnodeの配列を、なんらかの条件で
usortで自分で並べ替えればよいと思います。

$string = <<<XML
<?xml version='1.0'?>
<root>
<items><no>1</no></items>
<items><no>2</no></items>
<items><no>3</no></items>
<items><no>4</no></items>
</root>

$xml = simplexml_load_string($string);
$items = $xml->items;
function cmp($a, $b)
{
if ($a->no == $b->no) {
return 0;
}
return ($a->no > $b->no) ? -1 : 1;
}
usort($items,"cmp");
    • good
    • 0
この回答へのお礼

すごく良いヒントになりました。
rssをtwitterに投稿するBOTを作っていて、
普通にループするとRSSの先頭から投稿してしまい、
twitter上での日付が逆転して困っておりました。
ありがとうございました。

お礼日時:2010/10/05 14:44

No.3サンプルの補足です。


(そんな事、解ってるとゆうなら無視してください)

 $a->no == $b->no とか $a->no > $b->no

の記述はあなたがどのノードの何の属性値でどのように
ソートしたいか解らないので、
適当に書いただけですので、あしからず
    • good
    • 0

No1です。

もう一つありましたね。

http://www.php.net/manual/ja/book.sdo.php

SDOとして扱っても目的は達成できます。つまり、インスタントして最初からデーターベースオブジェクトとして扱う方法です。

これだクエリーとして逆順ソートすれば検索結果が逆順ソートで得られます。
    • good
    • 0

>rsortやarray_reverseを使ってみましたが、うまくいきませんでした



当然そうなります。オブジェクト指向のプログラミングが良くわかっていないと思います。このサイトで「Class」定義がオブジェクト指向のプログラミングと、誤解(間違いではないが、一部の機能しか説明していない<-一部とは40%ぐらい)を招く指導した方がいますが、この質問者の困っている内容が、まさにオブジェクト指向のプログラミングです。

まず、SimpleXML関数はnew 演算子を使って、XMLのインスタンスを作成していますね。

これは、PHPにXMLのDOMを扱えるように、PHPが最初から持っていたオブジェクトに新たなオブジェクトを追加することによって、DOM(Document オブジェクト model)を new 演算子で宣言することによって、PHPの中でも扱えるようにしたものです。

なので、rsortやarray_reverseは配列オブジェクトに対してのメソッドです。DOMオブジェクトに対して効くわけがない。

対象となるオブジェクトの違いを認識してください。いい機会ですからオブジェクト指向のプログラミングを理解しましょう。

配列オブジェクトに対するメソッドでやりたいのなら、DOMの階層または値(value or text element)を配列にバインドしないとだめですね。

通常、そんな面倒な事はしません。

http://www.php.net/manual/ja/funcref.php
http://www.php.net/manual/ja/refs.xml.php
http://www.php.net/manual/ja/book.xsl.php
http://www.php.net/manual/ja/book.xslt.php

このようなサイトを自分で理解できるようにがんばってください。ヒントは、XSL、XSLTを使用してフォーマットする事です。つまり、フォーマット(手順を踏んで、表示順序や表示位置、文字修飾を変更する)ファイルを定義して、それをエンジン(フォーマッター)にわたし、それでインスタンス(XMLソース)をフォーマットします。

つまり、XMLについて勉強しないとわからない。と言うことです。

もちろんforeachを使って、特定のエレメント以下をXMLソースで取得して、配列オブジェクトに格納すれば、目的は達成できます。それにしても、そのエレメントを取得するにはDOMを理解しないとできませんね。
    • good
    • 0
この回答へのお礼

ありがとうございます。
結局、配列に持ち直すことで達成しました。
いい機会なので勉強してみようと思います。

お礼日時:2010/10/05 14:40

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!


おすすめ情報