• ベストアンサー

配列から表の生成

はじめまして。 PHP4とMySQLを勉強し始めて半年ほどの初心者です。 DB から重複したデータを除いて以下の様な表をHTMLの<table>タグで 索引のようなページ(表1)を作成しようとしています。 大文字のアルファベットは、見出しタグ<th>を使っています。 (表1) ------------------------- |  A   |  B   |  C   | ------------------------- | a12w4b | bfghj  | cfgjg  | | a243dd | bfffh  |      | | a9ss2s | bglfkg |      | | aa87da |      |      | ------------------------- |  D   |  E   |  F   | ------------------------- | dh125a | easdhf | fabc  | | dksk  | eb12f3 | fddddd | | dx123y | eghjck | fhjkhl | |      | elet  | fxxxcx | |      | ezxczm |      | --------------------------  以下、「Z」まで同様に繰り返し、一つの表で表示。 ・各値の文字列の長さは一定ではありません。 ・各値の最初の文字は、必ず「a」~「z」で始まります。 ・各値の最初の文字以外は、アルファベットと数字がランダムに入ります。 ・各値は重複するものが有りません。(ユニーク値) ・各値の数量は、同じでは有りません。 上記の条件から以下の様に処理しようと考えました。 ---------------------------------------------- distinct を使って値を取り出し  ↓ 配列に格納  ↓ foreach でループ  ↓ ereg でパターンマッチ(先頭文字一致)  ↓ <td>タグ内に値を入れる  ↓ HTML表示 --------------------------------------------- phpのコードは、以下のようにしました。 //test.php echo "<table border=\"1\">"; echo "<tbody>"; echo "<tr>    <th>A</th>    <th>B</th>    <th>C</th>    </tr>"; echo "<tr>"; while($row = mysql_fetch_object($res)){ foreach ($row as $str) { if(ereg ("^a", $str)){ echo "<td>". $str . "</td>"; echo "<td>". $str . "</td>"; echo "<td>". $str . "</td>"; } } echo "</tr>"; } echo "</tbody>"; echo "</table><br>"; が...これでは先頭の文字「a」の値だけが(表2)の様に、同じように3列表示されるだけです。 (当たり前なのですが...) (表2) ------------------------- |  A   |   B  |  C   | ------------------------- | a12w4b | a12w4b | a12w4b | | a243dd | a243dd | a243dd | | a9ss2s | a9ss2s | a9ss2s | | aa87da | aa87da | aa87da | ------------------------- ereg関数の部分を以下の様にしましたが、見出しの「A」・「B」・「C」に対応せず、うまく表示されません。 foreach ($row as $str) { if(ereg ("^a", $str)){ echo "<td>". $str . "</td>"; } if(ereg ("^b", $str)){ echo "<td>". $str . "</td>"; } if(ereg ("^c", $str)){ echo "<td>". $str . "</td>"; } } また、見出し「A」・「B」・「C」以降の「D」・「E」・「F」、「G」・「H」・「I」、... に対応する値をどの様に取り出し、表示すればよいのかも判りません。 どなたか判る方がいらっしゃれば、ご教授の程宜しくお願いいたします。

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

  • ベストアンサー
  • jocole
  • ベストアンサー率14% (1/7)
回答No.2

とりあえず思いつきで・・・。 もっと賢い方法がありそうですが、参考になれば。 ------------------------------------------------ // INDEX $index['A'] = 0; $index['B'] = 1; $index['C'] = 2; ~~~~~~~ $index['Z'] = 25; // 値を配列に格納 while($row = mysql_fetch_array($hoge) { // 頭文字を取得 $key = $row[フィールド名]{0}; // キーを大文字に $key = strtoupper($key); $array[$index[$key]][] = $row[フィールド名]; } // 配列のキーをアルファベット順にソート // クエリーでソートかければ不要かも ksort($array); // 実行結果 /*------------------------------- $array[0][0] = "axxxx1" $array[0][1] = "axxxx2" $array[0][2] = "axxxx3" $array[1][0] = "bxxxx1" ~~~~~~~~~~~~ $array[25][4] = "zxxxx5" -------------------------------*/ // 配列のキーを行としてソート foreach ($array as $key => $val) { foreach ($val as $k => $v) { $new_array[$k][] = $v; } } // 実行結果 /*------------------------------- $new_array[0][0] = "axxxx1" $new_array[0][1] = "bxxxx1" $new_array[0][2] = "cxxxx1" ~~~~~~~~~~~~ $new_array[25][0] = "axxxx25" $new_array[25][1] = "bxxxx25" ~~~~~~~~~~~~ $new_array[25][25] = "zxxxx25" -------------------------------*/ // テーブルに表示 echo "<table>"; // INDEX echo "<tr>"; foreach ($index as $key => $val) { echo "<th>".$key."</th>"; } echo "</tr>"; // 行書き出し foreach ($new_array as $key => $val) { echo "<tr>"; // セル書き出し foreach ($val as $value) { echo "<td>".$value."</td>"; } echo "</tr>"; } echo "</table>";

pa-pi-po
質問者

お礼

jocole様、非常に丁寧なご回答ありがとうございます。INDEXの「A」に全てのデータが表示されてしまいますが、大変参考になりました。<TH>と<TD>の関連付けを見直して、意図した結果を得られるように考えてみます。ありがとうございました。

全文を見る
すると、全ての回答が全文表示されます。

その他の回答 (2)

  • yambejp
  • ベストアンサー率51% (3827/7415)
回答No.3

distinct を使って値を取り出し  ↓ 配列に格納 の際に、 $sql="SELECT DISTINCT LEFT(`hoge`,1) AS `kasiramoji`,`hoge` FROM `テーブル` ORDER BY `hoge`"; $res=mysql_query($sql); while($rows = mysql_fetch_array($res,MYSQL_ASSOC)){ $data[$rows['kasiramoji']][]=$rows['hoge']; } みたいなやりかたでやれば、あとはforeachするだけですみます

pa-pi-po
質問者

お礼

yambejp様、参考にさせていただきます。ありがとうございました。

全文を見る
すると、全ての回答が全文表示されます。
  • gogo-tea
  • ベストアンサー率75% (25/33)
回答No.1

//一旦データを配列に格納してsortしておく sort($str); //頭文字a,b,c,d...を配列にする $index = array("a","b","c","d"); ------ データ表示部分 ----- <tr> for i ($indexのループ) {  <td>  <table>  for j ($strのループ)  {   //頭文字が$index[$i]に一致するかどうか   if(ereg ("^".$index[$i], $str[$j])) //こんな感じですかね?   <tr>    <td>     データ表示($str[$j])    </td>   </tr>  }  </table>  </td> } </tr> ------ / データ表示部分 ----- という形はどうでしょうか。 tdに直接データを表示させずに各tdにはtableを入れ子にして aの列なら先頭がaのデータの数だけ<tr><td></td></tr>を作るという方法です。 ご参考程度に・・・。 ※インデントに全角スペースを使ってます。

pa-pi-po
質問者

お礼

gogo-tea様、私の知識不足で期待通りの表示結果が得られていませんが、すごく参考になりました。ありがとうございました。

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • 連想配列から<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
  • 表の中の列の順番を入れ替える場合の表示方法

    HTMLが不慣れで質問が伝わらないかも知れませんが表の表現についてわかる方は教えてください。 例えば、ある表が存在する場合にB列とD列を入れ替えると中身の文字列もそれにしたがって列が入れ替わる表示方法について教えてください。 実際のサンプルHTMLだとこんな感じです↓ <html> <table border="1"> <tr> <th>A</th><th>B</th><th>C</th><th>D</th><th>E</th> </tr> </thead> <tr> <td>AAAAAAA</td> <td>BBBBBBB</td> <td>CCCCCCC</td> <td>DDDDDDD</td> <td>EEEEEEE</td> </tr> <tr> <td>A'A'A'A'A'</td> <td>B'B'B'B'B'</td> <td>C'C'C'C'C'</td> <td>D'D'D'D'D'</td> <td>E'E'E'E'E'</td> </tr> </table> </body> </html>

  • テーブルタグで、この様な表を作りたいです

    実は、現在テーブルタグを使って この2つの様な表を作りたいと思います http://firestorage.jp/download/6521d87b9576b05425f88f84f5d1f104da854e59 ちなみに、上記表の赤い線に関しては 分かり易くする為に、線の部分を赤く着色してるだけで 色は付かなくて構いません ただ…この色を付けた状態でも作れるなら 教えて頂ければ、その方法も勉強したいと思います それで、現在は上の表に対しては この様なタグで <table border=1><tr><td>画像</td><td>解説</td><td>画像</td><td>解説</td><td>解説</td></tr><tr><td>画像</td><td>解説</td><td>画像</td><td>解説</td><td>解説</td></tr><tr><td>解説</td><td>解説</td></tr></table> 下の表に対しては、この様なタグで作りました <table border=1><tr><td></td><td>文字</td><td>文字</td><td>文字</td></tr><tr><td rowspan="2" width="10">文字</td><td>文字</td><td>文字</td><td>文字</td></tr><tr><td>文字</td><td>文字</td><td>文字</td></tr></table> しかし、この場合余計な所にも枠が出来てしまう為 この様な状態で出来上がります http://firestorage.jp/download/a52b36dd5a3f1838a7d482c2c07e68062a846e7b それで、私の知識の範囲では それぞれを単独で作るしか方法が分からず この様に <table border=1><tr><td>文字</td><td>文字</td><td>文字</td><td>文字</td><td>文字</td></tr></tr></tr></table><table border=1><tr><tr><td>文字</td><td>文字</td><td>文字</td></tr></tr></table> 2つに分けて、それぞれを付けるしか分かりません この場合は、この様な表として反映しますが http://firestorage.jp/download/3fe730975c59ffcf275ba5899ea6a385d2c070e8 下の表に関しては分かりませんでした つまり実際の反映としては、こんな感じなんです http://firestorage.jp/download/76d64dcca6e82f11bfa71d3840cf302310e2206a そこで聞きたいんですが 上記の2つの様な表をテーブルタグで作る方法を 教えて頂けないでしょうか?

  • php文字化けについての質問

    <TABLE BORDER> 99表 <tr> <th> </th><th>1</th><th>2</th><th>3</th><th>4</th><th>5</th><th>6</th><th>7</th><th>8</th><th>9</th> </tr> <tr> <?php for ($i = 1; $i <= 9; $i++ ) { echo "<tr>\n"; echo '<th>'. $i ."</th>\n"; for ($j = 1; $j <= 9; $j++ ) echo '<td>'. $i * $j."</td>\n"; echo "</tr>\n"; } ?> </table> 表と言う文字が文字化けして???と表示されます phpの設定も何度も見直しているのですが 問題がが発見できません どなたかお教えください

    • ベストアンサー
    • PHP
  • 動的な表の計算

    いつもお世話になります。 見よう見まねでやっている初心者です。 下記のような動的な表があります(PHPで表の行が可変します。) name="aa"に入力された値とname="bb"に入力された値の足し算の 回答をname="kaito"に出したいと思っています。 計算ボタンを押すとname="kaito"に答えを出したいのですが、 以下のような式ですと当然ながら全く反応しません。 javascriptまたはPHPをどう記述すれば表の値を計算できるようになるのでしょうか? できれば具体的に教えて頂ければ大変助かります。 ご教授の程よろしくお願い致します。 <script> function keisan(){document.tasizan.kaito.value=(document.tasizan.aa.value)+(document.tasizan.bb.value)} </script> <form name="tasizan"> <table width="100" border="1"> <tr> <th width="10" scope="col">a</th> <th width="10" scope="col">b</th> <th width="20" scope="col">回答</th> </tr> <tr> <td><INPUT type="text" name="aa" ></td><td><INPUT type="text" name="bb" ></td><td><INPUT type="text" name="kaito" ></td> <td><input type="button" value="計算" onclick="keisan()"/></td> </tr> <tr> <td><INPUT type="text" name="aa" ></td><td><INPUT type="text" name="bb" ></td><td><INPUT type="text" name="kaito" ></td> <td><input type="button" value="計算" onclick="keisan()"/></td> </tr> <tr> <td><INPUT type="text" name="aa" ></td><td><INPUT type="text" name="bb" ></td><td><INPUT type="text" name="kaito" ></td> <td><input type="button" value="計算" onclick="keisan()"/></td> </tr> <tr> <td><INPUT type="text" name="aa" ></td><td><INPUT type="text" name="bb" ></td><td><INPUT type="text" name="kaito" ></td> <td><input type="button" value="計算" onclick="keisan()"/></td> </tr> </table> </form>

  • HTMLで外部ファイルの読み込み

    HTMLの表が存在するときに、その表の中に入る文字列を 別のファイル(テキストやHTML)で外部から読み込んで表示する方法について教えてください。まったくの素人です。。。 <html> <table border="1"> <tr> <th>A</th><th>B</th><th>C</th><th>D</th><th>E</th> </tr> </thead> ーーーーーーこの中が外部ファイルの記述ーーーーーーー <tr> <td>AAAAAAA</td> <td>BBBBBBB</td> <td>CCCCCCC</td> <td>DDDDDDD</td> <td>EEEEEEE</td> </tr> <tr> <td>A'A'A'A'A'</td> <td>B'B'B'B'B'</td> <td>C'C'C'C'C'</td> <td>D'D'D'D'D'</td> <td>E'E'E'E'E'</td> </tr> ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー </table> </body> </html>

  • WEB上の表でソートするためのJavaScript

    WEB上の表でソートするためのJavaScript 下記のHTMLのソースではTableを用いた表を作成していますが、 番号、名前、クラス、クラブの項目をWEB上でソートできる JavaScriptを教えて欲しいのです。 下記ソースの表では、番号順に並べていますが、名前順や、クラス順、 クラブ順に並べ変えたいのです。 ただ、これが表示は1列ではなくの3列に分けて表示したいのです。 3列でそれぞれソートするのではなく、3つの列を1つの連続した列 としてソートしたいのです。 ですから、ソートを実行するためのボタンは、各列には必要なく、左端の列の 各項目をボタンにできればと思っています。 どうぞよろしくお願い致します。 <table border="3"> <TR> <TD> <TABLE border="1" > <TR> <Th>番号</Th><Th>名前</Th><Th>クラス</Th><Th>クラブ</Th> </TR> <TR> <TD>1</TD><TD>ヤマダ</TD><TD>A</TD><TD>水泳</TD> </TR> <TR> <TD>2</TD><TD>タナカ</TD><TD>C</TD><TD>野球</TD> </TR> <TR> <TD>3</TD><TD>サトウ</TD><TD>E</TD><TD>水泳</TD> </TR> <TR> <TD>4</TD><TD>スズキ</TD><TD>D</TD><TD>茶道</TD> </TR> </TABLE> </TD> <TD> <TABLE border="1" > <TR> <Th>番号</Th><Th>名前</Th><Th>クラス</Th><Th>クラブ</Th> </TR> <TR> <TD>5</TD><TD>ワタナベ</TD><TD>B</TD><TD>バレー</TD> </TR> <TR> <TD>6</TD><TD>イトウ</TD><TD>C</TD><TD>水泳</TD> </TR> <TR> <TD>7</TD><TD>キムラ</TD><TD>A</TD><TD>柔道</TD> </TR> <TR> <TD>8</TD><TD>イシダ</TD><TD>B</TD><TD>卓球</TD> </TR> </TABLE> </TD> <TD> <TABLE border="1" > <TR> <Th>番号</Th><Th>名前</Th><Th>クラス</Th><Th>クラブ</Th> </TR> <TR> <TD>9</TD><TD>ワダ</TD><TD>C</TD><TD>卓球</TD> </TR> <TR> <TD>10</TD><TD>タダ</TD><TD>D</TD><TD>柔道</TD> </TR> <TR> <TD>11</TD><TD>ミキ</TD><TD>E</TD><TD>野球</TD> </TR> <TR> <TD>12</TD><TD>ハナダ</TD><TD>A</TD><TD>水泳</TD> </TR> </TABLE> </TD> </TR> </table>

  • 条件をつけて表として書き出すには

    何度もすみません。 http://oshiete1.goo.ne.jp/kotaeru.php3?q=2331409 の延長です。 データやリンク先を書き込んでいるb.js、c.jsは下記のようにして、表として書き出すものの条件を、例えば、データの15~25の間だけ表に書き出す…というようにさせたいと考えています。 例) b.js↓ var data = new Array() data[50] = "aaaaa" data[49] = "bbbbb"  ↓ data[0] = "xxxxx" c.js↓ var link = new Array() link[50] = "049.html" link[49] = "048.html"  ↓ link[0] = "001.html" 表を書き出すa.jsは教わったとおり、↓のように書き込んでいます。 for(i=data.length-1;i>=0;i--){ str_html = str_html + '<tr><td><a href=' + link[i] + '>' + data[i] + '</td>'; --i; if(i==-1){ str_html = str_html + '<td></td></tr>'; }else{ str_html = str_html + '<td><a href=' + link[i] + '>' + data[i] + '</td></tr>'; } } 最小限の改造でできる方法はないでしょうか。 よろしくお願いします。

  • フルCSSプロフェッショナルテンプレの表作成

    ビルダー15に同梱のフルCSSプロフェッショナルテンプレートで、まったく別の色の表を作成したいのですが、フルCSSのせいで、背景色が反映されません。 1、まったく別の表のためのCSSはどのように書けばいいのでしょうか? 2、それをどのように記述すればよいでしょうか? 3、または、フルCSS”表のデザイン”で選んだ表は、文字が小さく嫌なので、文字を大きく表示する方法はあるのでしょうか?(文章ごとにフォントサイズの変更しなきゃだめ?) ↓↓こんな感じで書いてみたのですが・・・。 CSSコード .example table { width: 640px; border: 1px #ff6347 solid; border-collapse: collapse; } .example td { border: 1px dashed; background-color: #ff6347; padding: 0 6px; } .example th { border: 1px dashed; background-color: #9acd32; } HTMLコード <div class="example"> <table> <tr> <th>1-1</th> <th>1-2</th> <th>1-3</th> <th>1-4</th> </tr> <tr> <td>2-1</td> <td>2-2</td> <td>2-3</td> <td>2-4</td> </tr> <tr> <td>3-1</td> <td>3-2</td> <td>3-3</td> <td>3-4</td> </tr> </table> </div>

  • 自動で増えてくれる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
このQ&Aのポイント
  • Windows7Home premiumを使っています。Windows10へアップグレードができません。
  • Windows10のダウンロードのページのからツールをダウンロードし、Media Creation Toolを管理者として実行すると起動しようとすると、『理由は不明ですが、お使いのPCでこのツールを実行することができません……エラーコード0x80072F8F-0x20000』となってしまいます。
  • どのように対応したらいいでしょうか?
回答を見る