映画のエンドロール観る派?観ない派?

連想配列からテーブル(<th>テーブルヘッダ項目を含む)を作成する関数を作ろうと思っています。
配列と関数をどのように書けばHTMLのソースのようになるでしょうか?
値によって、<td>と<th>を振り分けるようになど良い方法を教えてください。
(1.できれば配列で<td> </td>は省略したいと思います。)
(2.<th> </th>の指定場所は下のhtmlのように縦とか横とかにに変えられた方が良いです。)

//----- 関数 -----
function table($v) {
}

//----- 配列 -----
$s = array();
$s[0] = array( 'A-1' , 'B-1' , 'C-1' , 'D-1' , 'E-1' );
$s[1] = array( 'A-2' , 'B-2' , 'C-2' , 'D-2' , 'E-2' );
$s[2] = array( 'A-3' , 'B-3' , 'C-3' , 'D-3' , 'E-3' );
$s[3] = array( 'A-4' , 'B-4' , 'C-4' , 'D-4' , 'E-4' );
$s[4] = array( 'A-5' , 'B-5' , 'C-5' , 'D-5' , 'E-5' );
table($s);


//----- 生成されるhtml -----
<table>
<tr><th>A-1</th><th>B-1</th><th>C-1</th><th>D-1</th><th>E-1</th></tr>
<tr><td>A-2</td><td>B-2</td><td>C-2</td><td>D-2</td><td>E-2</td></tr>
<tr><td>A-3</td><td>B-3</td><td>C-3</td><td>D-3</td><td>E-3</td></tr>
<tr><td>A-4</td><td>B-4</td><td>C-4</td><td>D-4</td><td>E-4</td></tr>
<tr><td>A-5</td><td>B-5</td><td>C-5</td><td>D-5</td><td>E-5</td></tr>
</table>


<table>
<tr><th>A-1</th><td>B-1</td><td>C-1</td><td>D-1</td><td>E-1</td></tr>
<tr><th>A-2</th><td>B-2</td><td>C-2</td><td>D-2</td><td>E-2</td></tr>
<tr><th>A-3</th><td>B-3</td><td>C-3</td><td>D-3</td><td>E-3</td></tr>
<tr><th>A-4</th><td>B-4</td><td>C-4</td><td>D-4</td><td>E-4</td></tr>
<tr><th>A-5</th><td>B-5</td><td>C-5</td><td>D-5</td><td>E-5</td></tr>
</table>


//----- 考え中??の配列 -----
$s = array();
$s[0] = array( '<th>A-1</th>' , '<th>B-1</th>' , '<th>C-1</th>' , '<th>D-1</th>' , '<th>E-1</th>' );
$s[1] = array( 'A-2' , 'B-2' , 'C-2' , 'D-2' , 'E-2' );
$s[2] = array( 'A-3' , 'B-3' , 'C-3' , 'D-3' , 'E-3' );
$s[3] = array( 'A-4' , 'B-4' , 'C-4' , 'D-4' , 'E-4' );
$s[4] = array( 'A-5' , 'B-5' , 'C-5' , 'D-5' , 'E-5' );
table($s);

$s = array();
$s[0] = array( 'th' => 'A-1' , 'B-1' , 'C-1' , 'D-1' , 'E-1' );
$s[1] = array( 'th' => 'A-2' , 'B-2' , 'C-2' , 'D-2' , 'E-2' );
$s[2] = array( 'th' => 'A-3' , 'B-3' , 'C-3' , 'D-3' , 'E-3' );
$s[3] = array( 'th' => 'A-4' , 'B-4' , 'C-4' , 'D-4' , 'E-4' );
$s[4] = array( 'th' => 'A-5' , 'B-5' , 'C-5' , 'D-5' , 'E-5' );
table($s);


//----- 参考中のソース -----
//-- http://oshiete.goo.ne.jp/qa/8107250.html

function table($v) {
echo '<table>';
foreach ($v as $t1) {
echo '<tr>';
foreach ($t1 as $t2) {
echo '<td>' . $t2 . '</td>';
}
echo '</tr>';
}
echo '</table>';
}

A 回答 (4件)

配列のキーを元に処理をすればよいかと



<?PHP
$s = array(
array('A-1','B-1','C-1','D-1','E-1')
,array('A-2','B-2','C-2','D-2','E-2')
,array('A-3','B-3','C-3','D-3','E-3')
,array('A-4','B-4','C-4','D-4','E-4')
,array('A-5','B-5','C-5','D-5','E-5')
);
$t1="<table>\n";
foreach ($s as $row){
$t1.="<tr>\n";
foreach($row as $key_1=>$val){
if($key_1==0){
$t1.="<th>".htmlspecialchars($val)."</th>\n";
}else{
$t1.="<td>".htmlspecialchars($val)."</td>\n";
}
}
$t1.="</tr>\n";
}
$t1.="</table>\n";
$t2="<table>\n";
foreach ($s as $key_0=>$row){
$t2.="<tr>\n";
foreach($row as $val){
if($key_0==0){
$t2.="<th>".htmlspecialchars($val)."</th>\n";
}else{
$t2.="<td>".htmlspecialchars($val)."</td>\n";
}
}
$t2.="</tr>\n";
}
$t2.="</table>\n";

print $t1;
print $t2;

場合によっては、カウンタを使う方が有効かもしれません
    • good
    • 0
この回答へのお礼

解答ありがとうございました。

どれも 有益な回答でしたが 今回は これを採用しました。

お礼日時:2013/07/17 22:08

#2です。

蛇足。

データベースなどから取り出す場合はこんな感じで処理する方が
わかりやすいですね

<?PHP
$s = array(
array('A-1'=>'A-2','B-1'=>'B-2','C-1'=>'C-2','D-1'=>'D-2','E-1'=>'E-2')
,array('A-1'=>'A-3','B-1'=>'B-3','C-1'=>'C-3','D-1'=>'D-3','E-1'=>'E-3')
,array('A-1'=>'A-4','B-1'=>'B-4','C-1'=>'C-4','D-1'=>'D-4','E-1'=>'E-4')
,array('A-1'=>'A-5','B-1'=>'B-5','C-1'=>'C-5','D-1'=>'D-5','E-1'=>'E-5')
);

$t="<table>\n";
$t.="<thead>\n";
foreach (array_keys($s[0]) as $val){
$t.="<th>".htmlspecialchars($val)."</th>\n";
}
$t.="</thead>\n";
$t.="<tbody>\n";
foreach ($s as $row){
$t.="<tr>\n";
foreach($row as $key_1=>$val){
$t.="<td>".htmlspecialchars($val)."</td>\n";
}
$t.="</tr>\n";
}
$t.="</tbody>\n";
$t.="</table>\n";
print $t;
?>

単に連想配列であれば1行目と2行目以降のキーが同等である保証はありませんが
データベースなどからの抽出であれば同等のデータとなるはずなので・・・
    • good
    • 0

昔、同じようなの書いた事あるので、今回のに合わせて修正したのをあげてみます。



<?php
$s = array();

$s[0] = array( 'A-1' , 'B-1' , 'C-1' , 'D-1' , 'E-1' );
$s[1] = array( 'A-2' , 'B-2' , 'C-2' , 'D-2' , 'E-2' );
$s[2] = array( 'A-3' , 'B-3' , 'C-3' , 'D-3' , 'E-3' );
$s[3] = array( 'A-4' , 'B-4' , 'C-4' , 'D-4' , 'E-4' );
$s[4] = array( 'A-5' , 'B-5' , 'C-5' , 'D-5' , 'E-5' );

print table($s , "tate");
print table($s , "yoko");
//--------------------------------------------
function table($s , $xy) {
$out = "";
foreach($s as $y => $arrX) {
$out.= "<tr>";
foreach($arrX as $x => $dat) {
$out.= XY($x , $y , $xy , $dat);
}
$out.= "</tr>";
}
$out = "<table border=1>$out</table>";
return($out);
}

function XY($x , $y , $xy , $dat) {
$dat = htmlspecialchars($dat);
if ($xy == "tate") {
$dat = ($x == 0) ? TH($dat) : TD($dat);
} else {
$dat = ($y == 0) ? TH($dat) : TD($dat);
}
return($dat);
}

function TD($str) { return("<td>" . $str . "</td>"); }
function TH($str) { return("<th style='background-color:cornsilk;'>" . $str . "</th>"); }
//--------------------------------------------
?>

むやみやたらと関数にしてたり、色々アレですが。
    • good
    • 0

「配列の最初の要素」をthで展開してよければこんな感じですかね・・・



<?php
$s = array();
$s[0] = array( 'A-1' , 'B-1' , 'C-1' , 'D-1' , 'E-1' );
$s[1] = array( 'A-2' , 'B-2' , 'C-2' , 'D-2' , 'E-2' );
$s[2] = array( 'A-3' , 'B-3' , 'C-3' , 'D-3' , 'E-3' );
$s[3] = array( 'A-4' , 'B-4' , 'C-4' , 'D-4' , 'E-4' );
$s[4] = array( 'A-5' , 'B-5' , 'C-5' , 'D-5' , 'E-5' );
print table($s);

function table($arg) {
if (!is_array($arg)) { return false; }
$ret = '';
$ret .= '<table>' . PHP_EOL;
$td = 'th';
foreach ($arg as $line) {
if (!is_array($line)) { continue; }
$ret .= '<tr>' . PHP_EOL;
foreach ($line as $item) {
$ret .= '<' . $td . '>' . htmlspecialchars($item, ENT_QUOTES) . '</' . $td . '>' . PHP_EOL;
}
$ret .= '</tr>' . PHP_EOL;
$td = 'td';
}
$ret .= '</table>' . PHP_EOL;
return $ret;
}
    • good
    • 0

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


おすすめ情報