人力検索はてな
モバイル版を表示しています。PC版はこちら
i-mobile

前回質問させて頂いたものの続きなのですが、
以下sample.xmlという名称で保存しているファイルがありまして

<?xml version="1.0" encoding="UTF-8"?>
<aaa age_limit="LL">
<rank point="1.37500" order="1"> <team area3="青葉区" area2="横浜市" area1="神奈川県" email="" url="" name="ABCDE" id="123456"/>
</rank>
<rank point="1.27500" order="1"> <team area3="青葉区" area2="横浜市" area1="神奈川県" email="" url="" name="FGHIJ" id="789012"/>
</rank>

出力結果を

<tr>
<td width="36">rank</td>
<td width="211">チーム名</td>
<td width="63">&nbsp;</td>
<td width="65">&nbsp;</td>
<td width="61">ポイント</td>
</tr>
<tr>
<td>1</td>
<td>ABCDE</td>
<td>横浜市</td>
<td>青葉区</td>
<td>1.37500</td>
</tr>
<tr>
<td>2</td>
<td>FGHIJ</td>
<td>横浜市</td>
<td>青葉区</td>
<td>1.27500</td>
</tr>
というようにしたい場合、どうやるのでしょうか。

<tr>から</tr>までの中身が膨大にあるので、繰り返し処理を
したいのですが、<tr>の中にデータを入れる方法を教えてもらえますでしょうか。

以前の質問をご参照頂ければ追加のスクリプトだけでも結構なのですが・・・
http://q.hatena.ne.jp/1308555064

●質問者: vfr6822
●カテゴリ:インターネット ウェブ制作
✍キーワード:XML スクリプト データ ファイル ポイント
○ 状態 :終了
└ 回答数 : 2/2件

▽最新の回答へ

1 ● rouge_2008
●100ポイント ベストアンサー

前回の質問でのpacochiさんの回答の2番目のコード(SimpleXMLを使う方法)がベースになっています。

<?php

$xml_str = file_get_contents('./sample.xml');
$aaa = new SimpleXMLElement($xml_str);

# テーブルの項目を繰り返し処理の前に出力します。
print $table = <<<HEAD
<table>
<tr>
<td width="36">rank</td>
<td width="211">チーム名</td>
<td width="63">&nbsp;</td>
<td width="65">&nbsp;</td>
<td width="61">ポイント</td>
</tr>
HEAD;

$cnt = 0;
foreach ($aaa->rank as $rank) {

$cnt++; # ランキング順位用
# 必要な値を変数に代入します。
$order = $rank['order'];
$point = $rank['point'];
$area3 = $rank->team['area3'];
$area2 = $rank->team['area2'];
$area1 = $rank->team['area1'];
$id = $rank->team['id'];
$name = $rank->team['name'];

# テーブルの行出力の繰り返し処理。取得したデータをここで挿入します。
$data = "<tr>\n";
$data .= "<td>{$cnt}</td>\n";
$data .= "<td>{$name}</td>\n";
$data .= "<td>{$area2}</td>\n";
$data .= "<td>{$area3}</td>\n";
$data .= "<td>{$point}</td>\n";
$data .= "</tr>\n";

echo $data;

}

# テーブルの閉じタグを繰り返し処理の終了後に出力します。
echo "</table>\n";

exit;

?>

XMLのデータがランク順位の通りに並んでいないのでしたら、配列に変換してポイント数の降順でソートしてから処理します。

(※SimpleXMLオブジェクトの配列への変換は「SimpleXMLで取得したオブジェクトを属性も含めて配列に変換」のxml2arrを使用させて頂きました。)

<?php

$xml_str = file_get_contents('./sample.xml');
$aaa = new SimpleXMLElement($xml_str);

$result = array();
$result = xml2arr($aaa); # 配列に変換
array_multisort($result["rank"], SORT_DESC); # ポイント数で降順ソート

# オブジェクト→配列変換用関数(http://soft.fpso.jp/develop/php/entry_2764.html)
function xml2arr($xmlobj) {
$arr = array();
if (is_object($xmlobj)) {
$xmlobj = get_object_vars($xmlobj);
} else {
$xmlobj = $xmlobj;
}

foreach ($xmlobj as $key => $val) {
if (is_object($xmlobj[$key])) {
$arr[$key] = xml2arr($val);
} else if (is_array($val)) {
foreach($val as $k => $v) {
if (is_object($v) || is_array($v)) {
$arr[$key][$k] = xml2arr($v);
} else {
$arr[$key][$k] = $v;
}
}
} else {
$arr[$key] = $val;
}

}
return $arr;
}

print $table = <<<HTML
<table>
<tr>
<td width="36">rank</td>
<td width="211">チーム名</td>
<td width="63">&nbsp;</td>
<td width="65">&nbsp;</td>
<td width="61">ポイント</td>
</tr>
HTML;

$cnt = 0;
foreach ($result['rank'] as $rank) {

$cnt++;
$order = $rank['@attributes']['order'];
$point = $rank['@attributes']['point'];
$area3 = $rank['team']['@attributes']['area3'];
$area2 = $rank['team']['@attributes']['area2'];
$area1 = $rank['team']['@attributes']['area1'];
$id = $rank['team']['@attributes']['id'];
$name = $rank['team']['@attributes']['name'];

$data = "<tr>\n";
$data .= "<td>{$cnt}</td>\n";
$data .= "<td>{$name}</td>\n";
$data .= "<td>{$area2}</td>\n";
$data .= "<td>{$area3}</td>\n";
$data .= "<td>{$point}</td>\n";
$data .= "</tr>\n";

echo $data;

}

echo "</table>\n";

exit;

?>

2 ● tobeoscontinue
●50ポイント
<?php
$xml = simplexml_load_file("./sample.xml");

$td = array();
$no = 0;
foreach($xml->rank as $rank) {
 $td[] = array(++$no, $rank->team["name"],$rank->team["area2"],$rank->team["area3"],$rank["point"]);
}

foreach ($td as $r) {
 echo "<tr>\n";
 foreach ($r as $l) echo " <td>".$l."</td>\n";
 echo "</tr>\n";
}
?>

1)simplexml_load_fileでXMLファイルを読み込みます。

2)$xmlからデータを抜き出して二次元の配列$tdに取り込みます。

最初の項目がシーケンスな番号なのかorderなのか判断できなかったのですが

orderの場合は++$noを$rank["order"]に変更して下さい。

3)二次元の配列$tdをtr、tdタグで囲んで出力します。

◎質問者からの返答

ありがとうございます。試してみたらデータは表示できました。

お手数ですが

rank

チーム名

 

 

ポイント

などのようにtableに整列させる方法を教えてください

関連質問


●質問をもっと探す●



0.人力検索はてなトップ
8.このページを友達に紹介
9.このページの先頭へ
対応機種一覧
お問い合わせ
ヘルプ/お知らせ
ログイン
無料ユーザー登録
はてなトップ