- ベストアンサー
SimpleXML関数で取得したXML要素を逆順にしたい
SimpleXML関数で取得したXML要素を逆順にしたい お世話になります。 phpのsimplexml関数で取得したXML要素を 逆順にして表示させるにはどうしたらよいでしょうか? 通常、RSSなどを読み込み表示させた場合、新しいものから並ぶと思いますが、 これを逆順で古いほうから並ばせたいです。 rsortやarray_reverseを使ってみましたが、うまくいきませんでした。 よろしくお願いします。
- みんなの回答 (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");
その他の回答 (3)
- yyr446
- ベストアンサー率65% (870/1330)
No.3サンプルの補足です。 (そんな事、解ってるとゆうなら無視してください) $a->no == $b->no とか $a->no > $b->no の記述はあなたがどのノードの何の属性値でどのように ソートしたいか解らないので、 適当に書いただけですので、あしからず
- 0909union
- ベストアンサー率39% (325/818)
No1です。もう一つありましたね。 http://www.php.net/manual/ja/book.sdo.php SDOとして扱っても目的は達成できます。つまり、インスタントして最初からデーターベースオブジェクトとして扱う方法です。 これだクエリーとして逆順ソートすれば検索結果が逆順ソートで得られます。
- 0909union
- ベストアンサー率39% (325/818)
>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を理解しないとできませんね。
お礼
ありがとうございます。 結局、配列に持ち直すことで達成しました。 いい機会なので勉強してみようと思います。
お礼
すごく良いヒントになりました。 rssをtwitterに投稿するBOTを作っていて、 普通にループするとRSSの先頭から投稿してしまい、 twitter上での日付が逆転して困っておりました。 ありがとうございました。