いつもお世話になっております。
オブジェクト型(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としか表記されません。
色々調べたりしたのですが、
お手数ですが、教えて下さい。
No.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"を変数化する場合はどのようにしたら宜しいのでしょうか。
お手数ですが、ご教授願えないでしょうか。
No.2ベストアンサー
- 回答日時:
ちょっと読み取れているかどうか自信がありませんが、やりたいのはこういうことでしょうか?
<?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]
の比較の違いはなんなんでしょう。
ご存知でしたら教えて頂けないでしょうか。
No.1
- 回答日時:
> arrayとしか表記されません。
array としか出ないなら、print_r してみるといいと思いますよ。
と、投げやりな回答をしてみる。
その「arrayとしか表記されない」件に関して、ちゃんと説明すると、「array」って表示されるのは、「その変数は配列ですよ」って事か、そのまんま「array って 文字列が入ってる」って事のどっちかです。
文字列かどうかは is_array すりゃ分りますが。
この回答への補足
返答有難う御座いました。
var_dumpやprint_rなどはして実行してみたのですが、
echo分で単体で表示されないから、
全て比較がfalseとなり、全件表示されている事は
知っていたのですが、
色々アドバイスを受けながら何とかできました。
有難う御座いました。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# C#テキストボックスの文字を配列にいれてその後表示する 4 2022/07/17 04:47
- 英語 Conclusion: Antibacterial effects against P. gingi 2 2022/07/12 01:51
- C言語・C++・C# 10個の実数に対する降順ソート結果を出力するプログラムを作りたいのですが、以下のプログラムをどう直せ 1 2022/07/09 22:16
- PHP PHPでCookieを使った訪問回数について 1 2023/05/28 14:10
- Visual Basic(VBA) vbaのエラー対応(実行時エラー7:メモリが不足しています) 4 2023/04/24 00:20
- その他(プログラミング・Web制作) pythonでDBのカラム名で取得したオブジェクトの値を表示したい 1 2022/05/13 03:41
- その他(プログラミング・Web制作) Python - Excel で Webからデータを連続取得したいのですが エラーが出ます 1 2023/07/06 20:08
- その他(プログラミング・Web制作) pandasでまとめてインデックスを削除するにはどうすればいいですか? たとえば、以下のプログラムで 1 2022/07/31 23:09
- Excel(エクセル) SUMIFSと日付変換 10 2023/04/16 15:38
- JavaScript EasyUIのSubGrid(jquery)におけるObjectに入れた連想配列について 1 2022/05/02 11:21
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
Resource id #3 と表示されま...
-
CSVデータの行数カウントをした...
-
自動で番号を振りたい
-
ヒアドキュメントの中のfor文
-
行数が30万件ほどあるCSVから、...
-
CSVでアップロードしたデータの...
-
csvの内容を行単位で削除したい
-
phpの関数について質問です!
-
PHP SimpleXml unsetについて
-
変数の中に変数を
-
php Undefined variableエラー
-
プログラミングのPythonのnoteb...
-
プルダウンメニューにDBの内容...
-
file_existsでファイル名の部分...
-
PHPのmin関数、「1」以上の数値...
-
スカラーのベクトル微分
-
Perlで重複行を削除したい
-
PHPでこのコード自体に意味は無...
-
特定の文からメールアドレスの...
-
3つの連想配列を交互に代入し...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
複数行のデータのPOST処理に関して
-
Resource id #3 と表示されま...
-
別ファイルの構造体の値を読み...
-
PHPでCSVの一部の行を編集したい
-
バイナリファイルの内容を、そ...
-
CSVファイルの最終行のデー...
-
ヒアドキュメントの中のfor文
-
stdClass Objectを連想配列のよ...
-
◆速い、ファイル読み込みは?
-
C言語でCSVファイルの行数を読...
-
phpでCSVファイルの中身を多次...
-
rubyで複数列のデータを一行に...
-
多次元配列の一次元目の最大値...
-
行数が30万件ほどあるCSVから、...
-
配列同士の足し算のループ処理
-
csvの内容を行単位で削除したい
-
FortranのOPEN文
-
CSVデータの行数カウントをした...
-
自動で番号を振りたい
-
While文を使って配列の中身を全...
おすすめ情報