前回質問させて頂いたものの続きなのですが、

以下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

回答の条件
  • 1人5回まで
  • 13歳以上
  • 登録:2011/07/20 13:23:44
  • 終了:2011/07/25 12:08:16

ベストアンサー

id:rouge_2008 No.1

rouge_2008回答回数594ベストアンサー獲得回数3512011/07/21 00:41:20

ポイント100pt

前回の質問での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;

?>

その他の回答(1件)

id:rouge_2008 No.1

rouge_2008回答回数594ベストアンサー獲得回数3512011/07/21 00:41:20ここでベストアンサー

ポイント100pt

前回の質問での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;

?>
id:tobeoscontinue No.2

tobeoscontinue回答回数214ベストアンサー獲得回数542011/07/21 00:49:08

ポイント50pt
<?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タグで囲んで出力します。

id:vfr6822

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

お手数ですが

rank

チーム名

 

 

ポイント

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

2011/07/25 12:00:45
  • id:vfr6822
    あ、すみません。解決できました。お二方ともありがとうございました。
    PCが壊れてしまい、ご返信が遅れましたこと、お詫びいたします。
  • id:vfr6822
    あ、すみません。解決できました。お二方ともありがとうございました。
    PCが壊れてしまい、ご返信が遅れましたこと、お詫びいたします。
  • id:tobeoscontinue
    単純には
    echo <<<HDR
    <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>
    HDR;

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

    echo "</table>";
    のようにするといいと思いますがhtmlのコードが混在するのは嫌なので
    配列$tdの要素として配列(属性,値)が入れるように拡張します。
    テーブルのヘッダー部分はarray(' width="36"',"チーム名")のように
    するのですが面倒なのでコードでそのようにします。そのため逆に長くなって
    しまいましたorz。
    $hdr = array("rank","チーム名","&nbsp;","&nbsp;","ポイント");
    $wth = array(36, 211, 63, 65, 61);
    $htd = array();
    foreach ($hdr as $k=>$v) {
    $htd[] = array(' width="'.$wth[$k].'"',$v);
    }

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

    echo "<table>\n";
    foreach ($td as $r) {
    echo "<tr>\n";
    foreach ($r as $l) {
    list($attr,$v) = is_array($l) ? $l : array('',$l);
    echo " <td".$attr.">".$v."</td>\n";
    }
    echo "</tr>\n";
    }
    echo "</table>";

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

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

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

絞り込み :
はてなココの「ともだち」を表示します。
回答リクエストを送信したユーザーはいません