PHPの質問です。PHP5のsimpleXMLを使っていますが、それとはあまり関係なく「PHPの書き方」に関する初歩的な質問です。


$xml =simplexml_load_string($$xmlstr, "SimpleXMLIterator" );

これでxml文章を読み込んでいます。

$asin = $xml->Items->Item[0]->ASIN;

こうすると、xmlから読み取ったデータを変数$asinに入れてくれます。
具体的には24152365のようになります。

ここからが質問なのですが、
$asin_2 ='$xml->Items->Item[1]->ASIN';
このように文字列として$asin_2に入れます。

$asin_2内に入った文字列を命令として実行するにはどうすればいいのでしょうか?

回答の条件
  • 1人2回まで
  • 登録:
  • 終了:2007/03/29 12:55:40
※ 有料アンケート・ポイント付き質問機能は2023年2月28日に終了しました。

ベストアンサー

id:nandedarou No.2

回答回数230ベストアンサー獲得回数34

ポイント60pt

先ほど締め切られたので、回答できませんでしたが、

再開されたということは、もうちょっと、具体的な回答を望んでいるということだと思いますので、具体的に書いてみます。


evalの引数として渡す文字列は、PHPの命令文として完成していなければなりません。

だから、'$tmp = 'と最後の';'を付け加えて渡します。

eval( '$tmp = '.$asin_2.';'  );

これで、$tmpに、24152365が入ります。

※$tmpを$asin_2とすれば、$asin_2に直接24152365が入ると思います。

id:tokyosmash

本来ならば文字列として格納しない方がスマートにできると思うんですが、なかなか上手く書けないんですね。

しかもevalを使うと負荷がかかるようで、500エラーが頻発してしまいます。

forを使って質問文のItem[0]の数字部分だけを一つづつ増やして、さらにXML内にそのようなデータがあるか判断しながら・・という作業をしていますが、simpleXMLとforが絡まってちょっと参ってます。

http://q.hatena.ne.jp/1174488194

こちらを参考に、なるべくevalを使わないでもっとスマートに書けるようにチャレンジしてみます。

いつもありがとうございます!


追記:

確かに一度締め切ってしまいましたが、もしかして回答を書き込む途中の方がいらっしゃたら失礼かなと思い再開しました。ご迷惑おかけしました。

2007/03/28 11:48:15

その他の回答1件)

id:GEN111 No.1

回答回数472ベストアンサー獲得回数58

ポイント40pt

http://www.phppro.jp/phpmanual/php/function.eval.html

PHP文として実行したいということなら eval を使えばよいと思います。

id:tokyosmash

ありがとうございます!早速使わせて頂きました。

2007/03/28 11:36:03
id:nandedarou No.2

回答回数230ベストアンサー獲得回数34ここでベストアンサー

ポイント60pt

先ほど締め切られたので、回答できませんでしたが、

再開されたということは、もうちょっと、具体的な回答を望んでいるということだと思いますので、具体的に書いてみます。


evalの引数として渡す文字列は、PHPの命令文として完成していなければなりません。

だから、'$tmp = 'と最後の';'を付け加えて渡します。

eval( '$tmp = '.$asin_2.';'  );

これで、$tmpに、24152365が入ります。

※$tmpを$asin_2とすれば、$asin_2に直接24152365が入ると思います。

id:tokyosmash

本来ならば文字列として格納しない方がスマートにできると思うんですが、なかなか上手く書けないんですね。

しかもevalを使うと負荷がかかるようで、500エラーが頻発してしまいます。

forを使って質問文のItem[0]の数字部分だけを一つづつ増やして、さらにXML内にそのようなデータがあるか判断しながら・・という作業をしていますが、simpleXMLとforが絡まってちょっと参ってます。

http://q.hatena.ne.jp/1174488194

こちらを参考に、なるべくevalを使わないでもっとスマートに書けるようにチャレンジしてみます。

いつもありがとうございます!


追記:

確かに一度締め切ってしまいましたが、もしかして回答を書き込む途中の方がいらっしゃたら失礼かなと思い再開しました。ご迷惑おかけしました。

2007/03/28 11:48:15
  • id:tokyosmash
    ちょっと説明が悪いかもしれません。

    $asin_2 =$xml->Items->Item[1]->ASIN;

    とすれば、$asin_2に25142545のような数字が入ります。


    $asin_2 ='$xml->Items->Item[1]->ASIN';

    しかしこのように文字列で入れてしまった場合はどうすればいいか、という事です。説明下手ですみませんがよろしくお願いします。
  • id:nandedarou
    (すみません。何度も書き直しました。)

    $asin = array();
    foreach($xml->Items->Item as $key => $value){
    $asin[$key] = $value->ASIN ;
    }

    で、できるかもしれません。(できなかったら、ごめんなさい。)
    結果は、
    print_r($asin);
    として確認してみて下さい。
  • id:tokyosmash
    いつも具体的で助かります。

    $asin = array();
    foreach($xml->Items->Item as $key => $value){
    $asin[$key] = $value->ASIN ;
    }

    こちらだとItemが一つしか取得できないんですよね。print_rすると一つしか出力されませんでした。

    for ($n = 1; $n <= 10; $n++) {
    $asin[$n] = $xml->Items->Item[$n];
    }

    先ほどコメント頂いたこちらだと全部取得できているようです。nは10までとは限らないので、もし$asin[$n]に何も入っていなければそこでforからbreakしてやれば何とかできそうです。


    取得したデータを他の部分と組み合わせるのにまた一苦労しそうですが、この質問に関しては解決しました。


    PHPでデータベースやXMLと接続する場合ほとんど配列でデータを取得するようなので、早くforeachの使い方をマスターしたいところです。

    いつもありがとうございます!
  • id:nandedarou
    そうですね。if でチェックして、breakすればいいですね。

    ところで、時間があったら、
    次のコードでできるか試してみてくれませんか?
    だめだったら、ごめんなさい。

    $asin = array();
    $x = $xml->Items->Item;
    foreach($x as $key => $value){
    $asin[$key] = $value->ASIN ;
    }

    print_r($asin);
    exit();
  • id:tokyosmash
    これだと最後のデータしか表示されないようです。

    つまり
    Item[0]
    Item[1]
    Item[2]
    というデータがあれば、Item[2]のみという事です。
  • id:nandedarou
    ということは、なんとかすれば、最後の添え字である2がわかるかもしれませんね?
    でも、breakでなんとかできるなら、それでいいですね。
    お手数お掛けしました。
  • id:tokyosmash
    とりあえずifでbreakする方法で先に進みたいと思います。時間があれば戻ってきて、foreachでスマートに書き直したいと思います。
    トライ&エラーの繰り返しは勉強になりますが、少々疲れますね。だんだんとスクリプトの量が増えてきて、エラーが出ても原因がつかめくなってきています。

    でも頭の体操になって面白いです。
    今回もありがとうございました。
  • id:nandedarou
    ある程度まとまった処理は、関数にしていくとデバッグが楽になりますよ。
    関数の引数の渡し方や結果の返し方などを学ぶ必要がありますが、
    見易さ、処理の明確さ、変数のスコープの明確さ、ロジックの整理
    などなど…有利な点が多くあります。
  • id:tokyosmash
    今日出社中に電車の中で「独習PHP」を読んでまして、ちょうど自作関数の項目を勉強しました。確かにまとめた方がコードがすっきりして見易いですよね。今から勉強がてら書き直してみようと思います。

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

回答リクエストを送信したユーザーはいません