• ベストアンサー

テーブルデータ表示

mysqlからデータをphpで取得し以下のような多次元配列になっています。 Array ( [0] => Array ( [id] => 116 [name] => あああ ) [1] => Array ( [id] => 58 [name] => いいい ) [2] => Array ( [id] => 89 [name] => ううう ) ) 単純にデータを表示させたく以下のようにしましたが<th>$key2</th>の箇所が上記配列の場合 2回繰り返されて表示されてしまいます。ここはフィールド名なので1回の表示でいいのですが どのように記述すれば思うような表示になるでしょうか? echo "<table border=\"1\">"; echo "<tr>"; foreach ($tmp1 as $key => $val) { foreach ($val as $key2 => $val2) { echo "<th>" . $key2 . "</th>"; //フィールド名 } } echo "</tr>"; foreach ($tmp1 as $key => $val) { echo "<tr>"; foreach ($val as $key2 => $val2) { echo "<td>" . $val2 . "</td>"; // 取得したデータをある分だけ繰り返し } echo "</tr>"; } echo "</table>";

  • dcx147
  • お礼率33% (214/636)
  • PHP
  • 回答数3
  • ありがとう数1

質問者が選んだベストアンサー

  • ベストアンサー
  • 7tv3mm
  • ベストアンサー率75% (12/16)
回答No.2

表示を1回だけなら、↓では? foreach ($tmp1 as $key => $val) { foreach ($val as $key2 => $val2) { echo "<th>" . $key2 . "</th>"; } break; } または、 foreach ($tmp1[0] as $key => $val) { echo "<th>" . $key . "</th>"; }

その他の回答 (2)

回答No.3

とりあえず、前述されているもの以外の方法としまして、 //array_keysはその配列のキー(連想配列名)を全部取得する //なので、mysqlから取得した最初の配列部分のキーを取得しておく。 $keys = array_keys($array[0]); echo '<table border="1">'; echo '<tr>'; foreach($keys as $key){ echo '<th>'.$key.'</th>'; } echo '</tr>'; echo '<tr>'; foreach($array as $key=>$value){ echo '<td>'.$value.'</td>'; } echo '</tr>'; echo '</table>'; というのではいかがでしょうか。

回答No.1

<?php $arr = array(array("id"=> 116 ,"name"=>"あああ" ),array( "id"=> 58 ,"name"=>"いいい" ),array( "id"=> 89 ,"name"=>"ううう" )); /* DOMを使っているのはソースを書きたくないっていう好みの問題。 っていうか後半まで質問内容とこれっぽっちも関係ない。*/ $doc = new DOMDocument("1.0","UTF-8"); $doctype = $doc->implementation->createDocumentType("html","-//W3C//DTD XHTML 1.0 Strict//EN","http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"); $doc->appendChild($doctype); $doc->formatOutput = true; $html = $doc->createElementNS("http://www.w3.org/1999/xhtml","html"); $head = $doc->createElementNS("http://www.w3.org/1999/xhtml","head"); $title = $doc->createElementNS("http://www.w3.org/1999/xhtml","title"); $title->appendChild($doc->createTextNode("Q5016158 TestCase 1")); $head->appendChild($title); $body = $doc->createElementNS("http://www.w3.org/1999/xhtml","body"); $table = $doc->createElementNS("http://www.w3.org/1999/xhtml","table"); $caption = $doc->createElementNS("http://www.w3.org/1999/xhtml","caption"); $caption->appendChild($doc->createTextNode("表")); $table->appendChild($caption); $thead = $doc->createElementNS("http://www.w3.org/1999/xhtml","thead"); $tr = $doc->createElementNS("http://www.w3.org/1999/xhtml","tr"); /* 関係あるのはここから。*/ /* 要は二つに分ける。*/ $tmp = $arr[0]; foreach ($tmp as $key => $val) { $th = $doc->createElementNS("http://www.w3.org/1999/xhtml","th"); $th->appendChild($doc->createTextNode($key)); $tr->appendChild($th); } $thead->appendChild($tr); $tbody = $doc->createElementNS("http://www.w3.org/1999/xhtml","tbody"); $tr = $doc->createElementNS("http://www.w3.org/1999/xhtml","tr"); foreach ($arr as $key => $val) { $tr = $doc->createElementNS("http://www.w3.org/1999/xhtml","tr"); foreach ($val as $key2 => $val2) { $td = $doc->createElementNS("http://www.w3.org/1999/xhtml","td"); $td->appendChild($doc->createTextNode($val2)); $tr->appendChild($td); } $tbody->appendChild($tr); } $table->appendChild($thead); $table->appendChild($tbody); $body->appendChild($table); $html->appendChild($head); $html->appendChild($body); $doc->appendChild($html); print($doc->saveXML()); ?>

関連するQ&A

  • smartでのtable表示について

    ちょっとベタな書き方ですが下記のように、画像と名前のセットを表示して行く時に、 最後、余ったセルに{html_table}などを使って自動的に埋めて行く事は、出来ますでしょうか、 <table width="650" border="0" cellspacing="0" cellpadding="0"> {foreach from=$data item=data key=key name="loop"} {if $smarty.foreach.loop.iteration %5 ==1}<tr>{/if} <td> <table width="125" border="0" cellspacing="0" cellpadding="1"> <tr> <td><a href="{$data.id}.php"><img src="img/{$data.staff_file}" width="125" height="175" border="0"></a> </td></tr> <tr> <td>{$data.name} </td> </td></tr> </table> </td> {if $smarty.foreach.loop.iteration % 5 ==0}</tr>{/if} {/foreach} {if $smarty.foreach.loop.total % 5 ==4}<td> </td>{/if} {if $smarty.foreach.loop.total % 5 ==3}<td> </td><td> </td>{/if} {if $smarty.foreach.loop.total % 5 ==2}<td> </td><td> </td><td> </td>{/if} {if $smarty.foreach.loop.total % 5 ==1}<td> </td><td> </td><td> </td><td> </td>{/if} </table>

    • ベストアンサー
    • PHP
  • htmlで作成したフォームにcsvファイルのデータを表示するには

    <?php //ファイルを開く $fp = fopen('maillog.csv', 'r') or die('ファイルが開けません'); //テーブルを出力 echo '<table border="0">'; echo '<tbody>'; while ($field_array = fgetcsv($fp, 4096, ',', '"')) { echo '<tr>'; foreach ($field_array as $key=>$value) { if(!in_array($key,Array(0,1,2,3,4,5,6,7))) continue; echo '<td nowrap>'.htmlspecialchars($value, ENT_QUOTES).'</td>'; } echo '</tr>'; } echo '</tbody>'; echo '</table>'; //ファイルを閉じる fclose($fp); ?> 簡単な一覧は、できるのですが 下記、フォームに対してデータの一覧を表示するには どうすれば良いのでしょうか? 教えてください

    • 締切済み
    • PHP
  • 少し初歩的な質問です。

    比較しながら順位を付けていくためには、最初に「1」いれといて、「<=」大きければ順位をかえる・・・ ここまで書いて誤っていたことに気がつきました。改めて、最高得点をしる方法と比較して順位をだす関数ありますでしょうか? #.1f(初歩的すぎてすみません)下は頭の中です、合計点の出し方は積み重なっていくというところまでわかっています。順位の出し方も比較しながら数字を入れ替えればいいのかなと思っています。 <?php // 氏名をキーとする。 $tests = array( //点数 "鈴木" => array(92,1), "佐藤" => array(74,1), "中村" => array(42,1), "三浦" => array(65,1) ); $kamokusu = count($tests["鈴木"]); // 科目数 ?> <table border="2"> <tr> <th>名前</th> <th>点数</th> <th>順位</th> </tr> <?php // 個人の得点、合計点、平均点の行を表示 foreach ( $tests as $name => $test ) { echo "<tr>"; echo "<td>" . $name . "</td>"; // 個人名の表示 $total = 0; // 合計点初期化 // 個人の教科別の得点表示と合計点集計を行う foreach ( $test as $tensu ) { echo "<td>" . $tensu . "</td>"; // 得点表示 $total += $tensu; // 合計点集計 } } ?> </table>

    • ベストアンサー
    • PHP
  • 一致しないデータも表示させたい

    初心者です。 よろしくお願いいたします。 $sql = "SELECT * FROM table WHERE s_code IN ('" .$code."')"; $res = mysql_query($sql) or die("データ抽出エラー"); echo( "<TABLE>" ); echo( "<TR>" ); echo( "<TH>コード</TH>" ); echo( "<TH>コード名称</TH>" ); echo( "<TH>情報</TH>" ); echo( "</TR>\n" ); while ($row = mysql_fetch_array($res,MYSQL_ASSOC)){ echo( "<TR>" ); echo("<td>$row[s_code]</td>"); echo("<td>$row[name_j]</td>"); echo("<td>$row[contents]</td>"); echo( "</TR>\n" ); } 上記を実行すると $codeにカンマ区切りで入っているデータと テーブル(table)のs_codeに一致するデータが表示されます。 一致しないデータがあった場合は $codeのデータのみ表の1列目に記入させることは可能でしょうか。 たとえば、 $codeが (A,B,C)で table には AとCしか ない場合 -------------------------------- コード  コード名称  情報 -------------------------------- A りんご 青森産 B  C バナナ フィリピン産 --------------------------------- 説明が下手ですみません。 よろしくお願いいたします。

    • ベストアンサー
    • PHP
  • Noのデータ受け渡しで同じNoが表示されてしまうのは何故!?

    formdb_search.php 一覧表示させるphpです。 echo "<TR>\n"; echo "<FORM method=\"post\"action=\"./formdb_modify.php\">\n"; echo "<INPUT type=\"hidden\" name=\"data_no\" value=\"".$data_array[0]." \">\n"; echo "<TD nowrap><INPUT type=\"submit\" value=\" 詳細\"></TD>\n"; echo "<TD nowrap>" . $data_array[0] . "</TD>\n"; echo "<TD nowrap>" . $data_array[1] . "</TD>\n"; echo "<TD nowrap>" . $data_array[2] . "</TD>\n"; echo "<TD nowrap>" . $data_array[3] . "</TD>\n"; echo "<TD nowrap>" . $data_array[4] . "</TD>\n"; echo "<TD nowrap>" . $data_array[5] . "</TD>\n"; echo "<TD nowrap>" . $data_array[6] . "</TD>\n"; echo "</FORM>\n"; echo "</TR>\n"; //データ表示件数を1加算 $data_view++; } ?> <TR> <TH nowrap>詳細</TH> <TH nowrap>No.</TH> <TH nowrap>公開日</TH> <TH nowrap>求人の概要</TH> <TH nowrap>業界</TH> <TH nowrap>規模</TH> <TH nowrap>上場区分</TH> <TH nowrap>募集職種</TH> </TR> </TABLE> formdb_modifyのphpで、詳細を選択したNo.を表示するPGです。 // データファイルから1行ずつ配列として読込み $data_all = file("../../db/csv/maillog.csv"); //データ取得処理 for($i=1; $i < count($data_all);$i++){ // データを以下の配列として取得 // $data_array[0] - No. // $data_array[1] - 公開日 // $data_array[2] - 求人の概要 // $data_array[3] - 業界 // $data_array[4] - 規模 // $data_array[5] - 上場区分 // $data_array[6] - 募集職種 $data_array = explode(",",$data_all[$i]); $data_no = $_POST['data_no']; if($data_no == $data_no){ $kyujin=$data_array[0]; $koukai=$data_array[1]; $gaiyou=$data_array[2]; $gyoukai=$data_array[3]; $kibo=$data_array[4]; $kubun=$data_array[5]; $shokushu=$data_array[6]; $poji=$data_array[7]; $nenrei=$data_array[8]; $seibetsu=$data_array[9]; } } ?> <HTML> <HEAD> <META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=SHIFT_JIS"> <TITLE>データ詳細</TITLE> </HEAD> <BODY> <DIV align="center"> <H1>データ詳細 No.<?php echo $_POST['data_no'] ?></H1> <A href="./mail.html">求人案件情報登録へ</A> <A href="./formdb_search.php">求人案件一覧へ</A> <FORM method="post" action="<?php echo $PHP_SELF ?>"> <INPUT type="hidden" name="set" value="modify"> <INPUT type="hidden" name="data_no" value="<?php echo $data_no ?>"> <?php> $data_no = 0; ?> <TABLE align="center" cellpadding="10"> <TR align="left"> <TD>求人No.</TD> <TD><INPUT type="text" name="kyujin" size="20" value="<?php echo $kyujin ?>"></TD> </TR> 何故かどのNo.の詳細を選択しても同じNo.の詳細データが表示されてしまうのですが... 教えて下さい。

    • 締切済み
    • PHP
  • 自動で増えてくれるPHP

    以前に質問させて頂いた内容をもとに、以下のようなものを作成しました。 以前の質問 → http://okwave.jp/qa/q6858703.html 作成したもの ↓ 【Aサーバ】「a.txt」(データ用) $name01='一子'; $age01='11'; $name02='二郎'; $age02='22'; 【Bサーバ】「b.html」(表示用) <?php $data = file_get_contents ('http://www.A/a.txt'); foreach (explode("\n" , $data) as $value) { if (preg_match ("/\\$(.+)='(.+)'/", $value, $matches)) { $$matches[1] = $matches[2]; } } echo '<table>'; echo '<tr><th>'.$name01.'</th><td>'.$age01.'</td></tr>'; echo '<tr><th>'.$name02.'</th><td>'.$age02.'</td></tr>'; echo '</table>'; ?> ここで質問なのですが、↑のような仕組みで、a.txtの中身が $name03='三太'; $age03='33'; $name04='~~'; $age04='~~'; と増えていった場合、b.htmlの echo '<tr><th>'.$name~~.'</th><td>'.$age~~.'</td></tr>'; が自動的に増えてくれるようなものを作りたいと考えています。 配列(?)を使うという方法も調べてみたのですが、分からず……。 ご教示願います。

    • ベストアンサー
    • PHP
  • foreachの表示に追加するには

    http://okwave.jp/qa2460708.html と同じようなテーブル構造で、同じようなhtmlへの書き出しを行っています。 No.1さんの回答の下記のスクリプトを参考にし、うまく表示することができました。 $sql="SELECT `ID`,`SHOPNAME` FROM `SHOP`"; $res = mysql_query($sql,$link); while ($rows = mysql_fetch_assoc($res)) { $SHOP[$rows["ID"]]=$rows["SHOPNAME"]; } $sql="SELECT `ID`,`ITEMNAME` FROM `ITEM`"; $res = mysql_query($sql,$link); while ($rows = mysql_fetch_assoc($res)) { $ITEM[$rows["ID"]]=$rows["ITEMNAME"]; } foreach($SHOP as $key1=>$val1){ foreach($ITEM as $key2=>$val2){ $LINK[$key1][$key2]="&nbsp;"; } } $sql="SELECT `SHOP`,`ITEM` FROM `LINK`"; $res = mysql_query($sql,$link); while ($rows = mysql_fetch_assoc($res)) { $LINK[$rows["SHOP"]][$rows["ITEM"]]="○"; } print<<<eof <table border> <thead> <tr> <th>&nbsp;</th> eof; foreach($ITEM as $key2=>$val2){ print "<th>$val2</th>"; } print<<<eof </tr> </thead> <tbody> eof; foreach($SHOP as $key1=>$val1){ print "<tr>"; print "<td>$val1</td>"; foreach($ITEM as $key2=>$val2){ print "<td>{$LINK[$key1][$key2]}</td>"; } print "</tr>"; } print<<<eof </tbody> </table> eof; しかし、下記のテーブルに項目が1つ追加され、それも表示できるようにして欲しいと依頼されました。 Table:SHOP ID  SHOPNAME STATION ------------------------ 1   東京 | 表参道 2   大阪 | 梅田 3   福岡 | 天神 (略) 結果としては下記のように表示したいです。 NAME |STATION|化粧品|家具 |園芸 |食品 |家電 | ------------------------------------------------ 東京 | 表参道|   |   |   | ○ |   | 大阪 | 梅田 |   |   |   |   | ○ | 福岡 | 天神 | ○ | ○ |   |   |   | (略) 配列をよく理解できていないため、スクリプトをそのまま真似して $STATION[$rows["ID"]]=$rows["STATION"]; を作ったり $SHOP[$rows["ID"]][$rows["STATION"]]=$rows["SHOPNAME"]; を作ったりして無理矢理展開してみようとしましたが やはり表がぐちゃぐちゃになってしまいます。 どうすればうまく表示できるか、アドバイス頂けませんでしょうか。

    • ベストアンサー
    • PHP
  • 連想配列から<th>を含むテーブルを作成する関数

    連想配列からテーブル(<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://okwave.jp/qa/q8107250.html function table($v) { echo '<table>'; foreach ($v as $t1) { echo '<tr>'; foreach ($t1 as $t2) { echo '<td>' . $t2 . '</td>'; } echo '</tr>'; } echo '</table>'; }

    • ベストアンサー
    • PHP
  • No.を降順で表示するには

    // データファイルから1行ずつ配列として読み込み $data_all = file("../../db/csv/maillog.csv"); // データをHTML表示用に処理 for($i = 1 ; $i < count($data_all) ; $i++){ // 変数の開放 unset($a); // データを以下の配列として取得 // $data_array[0] - 求人NO // $data_array[1] - 公開日 // $data_array[2] - 求人の概要 // $data_array[3] - 業界 // $data_array[4] - 規模 // $data_array[5] - 上場区分 // $data_array[6] - 募集職種 $data_array = explode(",",$data_all[$i]); // データ表示フラグが成立している場合のHTML表示処理 echo "<TR>\n"; echo "<FORM method=\"post\" action=\"./mail.html\">\n"; echo "<TD nowrap><INPUT type=\"submit\" value=\" 詳細\"></TD>\n"; echo "<TD nowrap>" . $data_array[0] . "</TD>\n"; echo "<TD nowrap>" . $data_array[1] . "</TD>\n"; echo "<TD nowrap>" . $data_array[2] . "</TD>\n"; echo "<TD nowrap>" . $data_array[3] . "</TD>\n"; echo "<TD nowrap>" . $data_array[4] . "</TD>\n"; echo "<TD nowrap>" . $data_array[5] . "</TD>\n"; echo "<TD nowrap>" . $data_array[6] . "</TD>\n"; echo "<TD nowrap><INPUT type=\"submit\" value=\" 詳細\"></TD>\n"; echo "</FORM>\n"; echo "</TR>\n"; //データ表示件数を1加算 $data_view++; } ?> <TR> <TH nowrap>詳細</TH> <TH nowrap>No.</TH> <TH nowrap>公開日</TH> <TH nowrap>求人の概要</TH> <TH nowrap>業界</TH> <TH nowrap>規模</TH> <TH nowrap>上場区分</TH> <TH nowrap>募集職種</TH> </TR> </TABLE> 現状、表示するとNo.が昇順で表示されます。 このNo.を降順で表示させるにはどうすれば良いでしょうか? 教えてください。

    • 締切済み
    • PHP
  • 複数のレコードをimplodeでまとめる方法

    ほんと度々すいません…。 http://oshiete1.goo.ne.jp/qa3574682.htmlで一度解決したのですが、私の質問の仕方が悪く、結局実用できなかったので再度質問させてください。 上記URLでやったことに、更にフィールドが増えた場合の記述方法についてです。 table1 【ID|field1】 [1|AAA] [1|BBB] [2|CCC] [3|DDD] [3|EEE] [3|FFF] table2 【ID|field2】 [1|ooo] [2|ppp] [2|qqq] [2|rrr] [3|sss] [3|ttt] ↑構造が同じだけど内容が違うテーブルが5つあります(table1~table5まで)。そしてこれらのテーブルをクエリでは↓ <table> <tr><th>ID</th>   <th>field1</th>   <th>field2</th>   <th>field3</th>   <th>field4</th>   <th>field5</th></tr> <tr><td>1</td>   <td>AAA<br>BBB</td>   <td>ooo</td>   ・・・</tr> <tr><td>2</td>   <td>CCC</td>   <td>ppp<br>qqq<br>rrr</td>   ・・・</tr> <tr><td>3</td>   <td>DDD<br>EEE<br>FFF</td>   <td>sss<br>ttt</td>   ・・・</tr> </table> というように表示するのが理想です。 一応自分で考えましたが、できなかったので…お願いします。 ============================== 一応、前回http://oshiete1.goo.ne.jp/qa3574682.htmlにて頂いた回答をまとめたコードが↓です。 (table1のみの場合だとこうなります)→mr_araki様に感謝しております。 $query = mysql_query($sql); $rows = array(); while ($row = mysql_fetch_assoc($query)) {   if (!isset($rows[$row[ID]])) {      $rows[$row[ID]] = array();   }   $rows[$row[ID]][] = $row[field1]; } echo "<table>\n"; echo "<tr><th>ID</th><th>field1</th></tr>\n"; foreach ($rows as $id => $row) {   echo "<tr><td>" .$id. "</td><td>" .implode('<br>', $row). "</td></tr>\n"; } echo "</table>";

    • ベストアンサー
    • PHP

専門家に質問してみよう