• ベストアンサー

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

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

質問者が選んだベストアンサー

  • ベストアンサー
  • yyr446
  • ベストアンサー率65% (870/1330)
回答No.3

生成した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");

samdeco
質問者

お礼

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

全文を見る
すると、全ての回答が全文表示されます。

その他の回答 (3)

  • yyr446
  • ベストアンサー率65% (870/1330)
回答No.4

No.3サンプルの補足です。 (そんな事、解ってるとゆうなら無視してください)  $a->no == $b->no とか $a->no > $b->no の記述はあなたがどのノードの何の属性値でどのように ソートしたいか解らないので、 適当に書いただけですので、あしからず

全文を見る
すると、全ての回答が全文表示されます。
  • 0909union
  • ベストアンサー率39% (325/818)
回答No.2

No1です。もう一つありましたね。 http://www.php.net/manual/ja/book.sdo.php SDOとして扱っても目的は達成できます。つまり、インスタントして最初からデーターベースオブジェクトとして扱う方法です。 これだクエリーとして逆順ソートすれば検索結果が逆順ソートで得られます。

全文を見る
すると、全ての回答が全文表示されます。
  • 0909union
  • ベストアンサー率39% (325/818)
回答No.1

>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を理解しないとできませんね。

samdeco
質問者

お礼

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

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • simplexmlでルート要素の値を取得したい

    PHPでsimplexmlを用いていますが、XMLから値を取得する方法で、他のタグなどの情報は取り出せるのですが、ルート要素である以下の文章からtotalResultsの値である20だけを取り出したいですがうまくいきません。 <ResultSet totalResults="20" totalReturned="2"> 以下のようにあるところへ投げた結果のXMLを取得しています。 $file = file_get_contents( $url ); $xml = simplexml_load_string( $file ); お手数ですがよろしくお願いします。

    • ベストアンサー
    • PHP
  • phpのSimpleXMLでXMLの要素を参照したい。

    フォームからキーワードを受け取り、それを、xmlを参照しながらphpで出力したいのですが、最後の最後でつまずきます。 ------------------ <?php $doc = new domDocument(); // DOMDocumentオブジェクトにより、インスタンスを生成 $doc->load("./beta.xml"); // ファイルからXML文書を読みこむ $kywd = $_REQUEST['kywd']; // フォームからデータを受け取る $nodelist = $doc->getElementsByTagName('keyword'); // 指定した要素名(keyword)の全ての要素を取得 foreach ($nodelist as $node) { // 各要素を参照 if($kywd == $node->textContent){ // もし、フォームから受け取ったデータが要素と一致したら $xurl = $node->namespaceURI; // 要素の名前空間URLを取得して$xurlに代入 $xml = simplexml_load_file("./beta.xml"); // SimpleXMLによってXMLファイルをパースし、simplexml_elementオブジェクトを作成する $parent = $xml->children("$xurl"); // 指定したノードの子ノードの配列を取得 $hairetsu = $parent[0]->children("$xurl"); //取得した配列素$hairetsuに代入 foreach($hairetsu as $key=>$value) { // ちゃんと連想配列になっているか、ためしに出力 print ($key."→".$value."<br />"); } // 連想配列になっていることを確認 print $hairetsu["title"]; // しかし、キーを指定して値を取得しようとすると、なぜか得られない。 } } ?> 問題は最後のほうです。連想配列になっていることは確かに確認できる(titleというキーも、その値もある)のですが、連想配列のキーから値を参照しようとすると、なぜか値がNULLになっていて表示できません。私は趣味でプログラミングをする程度なので、おそらく基本的なところで間違っているのだと思いますが、それがどこだか分かりません。お教え願えないでしょうか。

    • ベストアンサー
    • PHP
  • SimpleXMLでデータが取得できない

    PHPで、RSSのデータが上手く取得できず、困っております。 最初はSimplePieというフリーのライブラリを使用していたのですが、 一部のRSSのデータが全く取得できなかったので、使用を諦めました。 自分で処理を書こうと思い、以下の手順を踏んで RSSのデータを取得することを考えついたのですが、 それでもデータが取得できませんでした。 1.file_get_contents($url)で、RSSの生データを取得する 2.RSSの文字エンコーディングをUTF-8⇒SJIS⇒UTF-8に再変換 3.simplexml_load_stringでRSSをパース 最初は1と3の手順しか行っておらず、 SimplePieでデータが取得できたRSSはこれでも問題なかったのですが データが取得できなかったRSSで同じものを試すと 文字コードに関するエラーが出てきたので、2の処理を加えました。 文字コードのエラーは全て解消されたのですが、 それでもsimplexml_load_stringでデータがパースできず、 手詰まりになってしまっている状況です。 文字コードエラーが発生しているRSSでも、 xmlの文字列自体は正常に取得できているようなので simplexml_load_stringの段階で何かが失敗しているのだとは思うのですが、 全くエラーも表示されないため、何がダメなのかが分かりません。 どなたか、原因に心当たりがあったら 教えていただけないでしょうか? どうぞよろしくお願いいたします。

    • 締切済み
    • PHP
  • simplexmlで取得したデータを配列へ。

    PHP5のsimplexml_load_fileでデータにアクセスし、配列に 入れたいのですが、うまくいきません。 $xml = simplexml_load_file($file); $arrayA = array(); foreach($xml->A as $A){ array_push($arrayA, $A); } print_r($arrayA); とすると、 Array ( [0] => SimpleXMLElement Object ( [0] => data1 ) [1] => SimpleXMLElement Object ( [0] => data2 ) [2] => SimpleXMLElement Object ( [0] => data3 ) ) となってしまいます。 そうではなくて、 Array ( [0] => data1 [1] => data2 [2] => data3 ) とデータの中身を直接配列に入れたいのですが、 どうすればよいのでしょうか。 非常に初歩的な質問じゃないかと思うのですが、どなたがご教示 いただけますと有難いです。 どうぞ宜しくお願い致します。

    • ベストアンサー
    • PHP
  • PHPでXMLファイルを読み込みたい

    PHPを使ってxmlファイルを読み込んで、タグの中のデータなどを読み込んだりしたいです。 ですが、自作のxmlファイルだと simplexml_load_file()で読み込めません。xmlファイルの文字コードを色々と変えて試してみましたが、できませんでした。 ちなみに以下のコードは正常に動きました。Yahoo!のxmlファイルです。 $url = "http://rss.weather.yahoo.co.jp/rss/days/5710.xml"; $rss = simplexml_load_file($url); 出力は「【 25日(金) 嶺北(福井) 】 晴れ - 23℃/8℃ - Yahoo!天気・災害」でした。 何度かやるうちにアルファベットは表示できても日本語が表示できないということもありました。 また、xmlファイルをphpのプログラムに作らせたいです。そのときに、simplexml_load_file()で読み込める日本語も含むxmlファイルをphpで作成するプログラムを教えていただけると嬉しいです。 お願いします。

    • ベストアンサー
    • PHP
  • PHP4でXMLを取得する方法

    XMLをPHPにて参照したいのですが、 レンタルサーバーがPHP4の為、PearのXML_Unserializerを使用しています。 通常問題なく使用できていたのですが、 http://weather.livedoor.com/forecast/rss/index.xml から取得してみようとした所、<ldWeather:lwws id="*" /> の箇所がどうしても取得出来ません。 print_rにて確認したところ、[ldWeather:lwws]となっているのですが、コロンがある場合はどのように取得したらいいのでしょうか? 以下がコードになります require_once("Unserializer.php"); $add = "http://weather.livedoor.com/forecast/rss/index.xml"; $xmldoc = join("",file($add)); $opt = array ('complexType' => 'object','parseAttributes' => 'true','attribuesArray' => '_attributes'); $xml = new XML_Unserializer($opt); $xml -> unserialize($xmldoc, false); $xml = $xml->getUnserializedData(); mb_convert_encoding($xml, "SJIS","UTF-8"); print_r($xml->channel->item[1]->ldWeather:lwws);←ここが問題箇所 PHPを始めたばかりで説明に不十分な箇所があるかも知れませんが、よろしくお願い致します。 PHPバージョン:PHP Version 4.4.6 XML取得先:Livedoor Weather Web Service 利用目的:勉強の為

    • ベストアンサー
    • PHP
  • simplexml_load_file() のかわりの simplexml_load_string() がエラーになる

    こんにちわ。 お時間あるかた、どうぞよろしくおねがいします。 現在、RSSを読み込んで、色々な処理をしたいと思っています。 そして、下記のコードを書いたところうまくいきました。 $root = simplexml_load_file($url); ところが、使っているレンタルサーバでは PHP.iniのallow_url_fopenをONにすることが禁止されていることを知ったので、 simplexml_load_string()を使うように、プログラムを書き換えました。(下記抜粋) $response = http($url . $parm); $line = explode("\n" , $response); // HTTPヘッダを消す for ( $i=0 ; $i < 100 ; $i++ ) if ( $line[$i] == "" ) break; // HTTPボディーだけ取得 $xml_str = ""; for ( $i++ ; $i < count($line) ; $i++ ) $xml_str .= $line[$i]; $root = simplexml_load_string($xml_str); こうしたところ、一部のRSSで、Error while parsing the documentが出るようになってしまいました。 いくつか試したところ、amebloのフィードはOKなのですが、他のRSSだとエラーになるようです。 $ret = get_rss("http://feedblog.ameba.jp/rss/ameblo/femiohji"); // OK $ret = get_rss("http://pub.ne.jp/marunohi/?action=rss&type=rss1.0"); // NG というわけで、 simplexml_load_file()のときは動いていたのですが、 simplexml_load_string()にしたらエラーになります。 原因がわからず、行き詰まってしまいました。 よろしくおねがいいたします。

    • ベストアンサー
    • PHP
  • RDFの名前空間の要素をxpathで取得したい

    http://xurrency.com/2.5/usd/to/jpy/feed こちらのURLのdc:valueの値を取得したく、今日初めてPHPを使ってみました。 ネットのいろいろなサンプルを見てみると、xpathで取得できることがわかり、 取得したい値が名前空間という要素だということがわかりました。 コードを書いてみたのですが、ブラウザで読み込むと「Array」という数値が 戻ってきてしまいます。dc:valueの値を取得するにはどのようにコードを 書けばよいでしょうか? (サーバーのPHPのバージョンは5.2.6です。) <?php $xml = simplexml_load_file("http://xurrency.com/2.5/usd/to/jpy/feed"); $xml->registerXPathNamespace('dc', 'http://purl.org/dc/elements/1.1/'); $result = $xml->xpath("//dc:value"); echo $result; ?>

    • ベストアンサー
    • PHP
  • simplexml_load_stringで取得したオブジェクトをペー

    simplexml_load_stringで取得したオブジェクトをページングして表示させたいのですが、どうすればよいでしょうか? ▽現状 $xml = simplexml_load_string (引数); $hits = $xml->Body->Items; foreach ($hits as $hit) { echo $hit->Url; echo $hit->UrlImage; となっていて、取得したものがそのまま表示されているだけの状態です。 下記サイトを参考に、ページングしようとしているのですが、 http://tenderfeel.xsrv.jp/php/639/ simplexml_load_stringで取得したオブジェクト型(?)のものを、 foreachではなく、for文で回数を指定させて回すには、 どうすればよいのでしょうか。

    • ベストアンサー
    • PHP
  • PHPでXMLから正規表現で特定の要素を抜き出しているんですが‥。

    このようなXMLがあったとします。 sample.xml ---------------------------- <rss> <xml> <title>タイトル</title> <link>ttp://xxx.jp/</link> </xml> </rss> ---------------------------- ここから <xml> ~ </xml> の部分だけを抜き出すのですが、 $data = file_get_contents("sample.xml"); preg_match_all("|<xml>((?:(?!</xml>).)*)</xml>|si", $data, $matchs); で、$matchs[1] の中に <xml> ~ </xml> の部分が配列で入っています。 この『((?:(?!</xml>).)*)』の部分の意味がよく分かりません。 これは先輩から教えてもらった構文ですが、先輩に聞いても詳しい意味を知らないそうです。 『? ! . *』の意味は理解しているけど『:』は参考書でもよく分かりませんでした。 ネットを少し検索したけどこの取得構文の解説が見つからないため質問します。 simpleXML のようなクラスを使わずに、他にも正規表現で XML から要素を取得できる簡単な方法をご存知の方がいましたらどうか教えてください。 急ぎではありませんのでよろしくお願いします。

    • ベストアンサー
    • PHP