プロが教えるわが家の防犯対策術!

いつもお世話になっております。

オブジェクト型(object)と文字列(string)の比較がうまくいかずに
困っている次第です。
ご教授願えないでしょうか。

一度質問後閉じたのですが、うまくいかず再度質問させて下さい。


[sample.xml}
<item>
<data0>
<cd>00001</cd>
<nm>yahoo</nm>
</data0>
<data1>
<cd>00002</cd>
<nm>google</nm>
</data1>
<data2>
<cd>00003</cd>
<nm>google_1</nm>
</data2>
<data3>
<cd>00004</cd>
<nm>google_2</nm>
</data3>


[php]
$cd = '00003'
$filename = sample.xml

$j = 0;
if($xml = simplexml_load_file($file_name)){
$cnt = count($xml);
for($i=0; $i<$cnt; $i++){
$data = 'data' .$i;
if($cd !== $xml->xpath($data .'/cd')){
$data[$j++] = $xml->$data->nm;
}
}
}

上記とした際、$nm != $xml->$data->nm が有効な比較となりません。
php の cdのみを配列に書き出したいです。

$xml->xpath($data .'/cd')でDisplayしてみると。
arrayとしか表記されません。

色々調べたりしたのですが、

お手数ですが、教えて下さい。

A 回答 (3件)

simplexml って確か文字列にキャストしてくれたよな、、、と思って調べてみると案の定、何の問題も無く、文字列にキャストできる。



もう一度、strval などでキャストしてみてはいかがだろうか。

XPathを利用するなら仕様を一度は目を通されてはいかがだろうか。

/cd
とした場合ルートの下の QName cd の要素を探しにいく。件のXMLにはルート配下に cd が無いため空の配列を返す。

要素 cd が必要な場合、やや乱暴になるが //cd 又はパスを通して /item/*[starts-with(local-name(),"data")]/cd

前者はすべての階層に属する cd を探すため厳密ではない。かといって後者も data で始まる子要素を探しているに過ぎないため、こちらも厳密ではない。

data0 や data1 は何を抽象化しているのかわからない。やるなら、data で抽象化し、属性値で連番を持たせてやればいい。

この回答への補足

返答有難う御座いました。

なぜか以前に試した、
$cd !== strval($xml->$dno->nm)でうまく行きました。
折角回答頂いたのにすみません。

>data0 や data1 は何を抽象化しているのかわからない。やるなら、data で抽>象化し、属性値で連番を持たせてやればいい。
こちらは汎用的にdata0,data1,data2と、順番を判定する為にもっています。
勉強不足で、/item/*[starts-with(local-name(),"data")]/cd を理解できていませんが、"data"を変数化する場合はどのようにしたら宜しいのでしょうか。

お手数ですが、ご教授願えないでしょうか。

補足日時:2011/12/01 10:32
    • good
    • 0

ちょっと読み取れているかどうか自信がありませんが、やりたいのはこういうことでしょうか?



<?php
$cd = '00003';
$filename = 'sample.xml';

if($xml = simplexml_load_file($filename)){
$data = array();
$cnt = count($xml);
for($i=0; $i<$cnt; $i++){
$dno = 'data' . $i;
if($xml->$dno->cd[0] != $cd){
$data[] = $xml->$dno->nm[0];
}
}
print '<pre>';
var_dump($data);
print '</pre>';
}

この回答への補足

返答有難う御座いました。

なぜか以前に試した、
$cd !== strval($xml->$dno->nm)でうまく行きました。
折角回答頂いたのにすみません。

因みに
print_r($xml->$dno->nm)をすると、
SimpleXMLElement Object ( [0] => 0003 )
で出力されるので、$xml->$dno->cd[0]で指定するんですよね。
$xml->$dno->nm と $xml->$dno->nm[0]
の比較の違いはなんなんでしょう。

ご存知でしたら教えて頂けないでしょうか。

補足日時:2011/12/01 10:28
    • good
    • 0

> arrayとしか表記されません。



array としか出ないなら、print_r してみるといいと思いますよ。

と、投げやりな回答をしてみる。

その「arrayとしか表記されない」件に関して、ちゃんと説明すると、「array」って表示されるのは、「その変数は配列ですよ」って事か、そのまんま「array って 文字列が入ってる」って事のどっちかです。
文字列かどうかは is_array すりゃ分りますが。

この回答への補足

返答有難う御座いました。

var_dumpやprint_rなどはして実行してみたのですが、
echo分で単体で表示されないから、
全て比較がfalseとなり、全件表示されている事は
知っていたのですが、

色々アドバイスを受けながら何とかできました。

有難う御座いました。

補足日時:2011/12/01 10:24
    • good
    • 0

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