配列表示画面方法について

このQ&Aのポイント
  • perlでHTMLにテーブルを書き出すプログラムを作成しております。画面仕様の変更により、読み込んだデータを横3列に表示するようテーブルの吐き出しを変更したいです。
  • 単純にファイルを3つに分けおのおのフォームで読み込むのではお粗末だと思い、表示部分のプログラムだけで解決したいです。
  • 解決策を教えていただけると助かります。
回答を見る
  • ベストアンサー

配列表示画面方法について

いつもお世話になります。 perlでHTMLにテーブルを書き出すプログラムを作成しております。 基本的にデータファイルを読込み、表示させているプログラムなのですが、画面仕様の変更により困っております。 たとえば下記のような構成のデータファイルを読込んで、読込んだデータを横3列(役職、氏名で一列)に表示するようテーブルの吐き出しを変更したいのですが、どのようにすればよろしいでしょうか ? <データファイル> 番号<>役職<>氏名 <書出し> 現在は読込んだデータをそのままセルに入れております。 <tr>   <td>$sNewsData[5]</td>   <td>$sNewsData[6]</td> </tr> 単純にファイルを3つに分けおのおのフォームで読込むのでは余りにもお粗末(データ書出しプログラムの変更をしたくない)と思いまして。 表示部分のプログラムだけで解決したいと思っております。 どなたかご教示願います。

  • Perl
  • 回答数3
  • ありがとう数1

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

  • ベストアンサー
  • osamuy
  • ベストアンサー率42% (1231/2878)
回答No.2

表示順序に制約が無いのであれば、 <tr><td>行1<td>行2<td>行3</tr> <tr><td>行4(snip.) ――で済むのでは。 表示順序を保ったまま3段分割するなら、 案1)いったん配列@dにデータを読み込んで、 push @a, map { '<><>'; }(1 .. (2-$#a) % 3); # 3段ぴったりになるよう詰め物。 my $step = ($#a + 1) / 3; #1段分のデータ数を計算。 ――として、 <tr><td>行1<td>行$step+1<td>行$step*2+1</tr> <tr><td>行2<td>行$step+2<td>行$step*2+2</tr> ――と出力。 案2)テーブルをネストする。 <table> <table> <tr><td>行1<td>行2<td>行3</tr> </table><table> <tr><td>行$step+1<td>行$step+2<td>行$step+3</tr> (snip)

cardy55
質問者

補足

ご回答ありがとうございます。 理解力不足で申し訳ありませんが案1をもう少し詳しく解説していただけますでしょうか? push @a, map { '<><>'; }(1 .. (2-$#a) % 3); や$step = ($#a + 1) や<tr><td>行1<td>行$step+1<td>行$step*2+1</tr>が分かりません。 大変恐縮ですが、よろしくお願いいたします。 今日中に製作しないといけないのですが、解決しておりません。

その他の回答 (2)

  • osamuy
  • ベストアンサー率42% (1231/2878)
回答No.3

データを3分割して出力するために、1次元配列のデータを2次元配列にみたてて、n行めを出力するためのデータを $a[0][n], $a[1][n], $a[2][n] ――として扱ってみるというのが案1です。 扱いたいデータは2次元ですが、実際に持ってるのは1次元のデータなので、2次元から1次元に逆変換する必要があります。 これは簡単で、1次元配列の要素数をNとし、それを3分割した場合の1段のサイズをMとすると、M * 3 = Nが成り立ち、2次元配列a[x][y]との間には1次元配列d[k]の間には、 x * M + y = k ――が成り立ちます。 これで1次元配列があったとき、そのデータを2次元配列のように扱う方法が理解できたかと思います。 実際には3で割り切れない場合があるので、要素を1個か2個追加して割り切れるようにしてみます。そうしておくと後のプログラミングが楽なので。それがpushとmapのところ。瑣末な話なので混乱させたのなら、申し訳ないです。

cardy55
質問者

お礼

osamuyw様回答が遅れて申し訳ありません。大変参考になりました。ありがとうございます。

  • rafysta
  • ベストアンサー率45% (24/53)
回答No.1

my $file = 'sample.dat'; open IN, '<', $file or die "cannot open $file: $!"; while(<IN>){ chomp; my @data = split /<>/; print "<tr>\n"; foreach(@data){ print "<td>$_</td>"; } print "</tr>\n"; } close IN;

関連するQ&A

  • テーブルのセルに画像をピッタリ表示するには

    よろしくお願いします。 テーブルの以下のタグ並びで、 <img src=>の部分の画像jpgを、枠にピッタリ表示したいのです。 以前作った他のhtmlファイルでは、画像のサイズに変化があっても、自動的に枠にピッタリ表示でき、 同じ通りタグを書いたはずなのですが、 なぜか?今回は、この画像が、 一行二列目の枠(これが大きくなってしまう) のその左端寄りに、幅よりも小さく浮いたように表示されてしまいます。(枠の右側に不要な余白ができてしまう) 枠や画像のサイズを固定しても同じです。 この画像の枠以外は、画像ではなくテキストです。 うまくいかないのはなぜなのでしょう? どこに間違いがあるのでしょうか、教えてください、お願いいたします。 <table width="85%"border="1" cellpadding="5" cellspacing="5" align="center"> <tr><td>一行一列目     </td> <td rowspan="3">1行二列目~ココの部分~<img src="" width="" height="" align="center" valign="top" alt=""> </td></tr> <tr><td>2行一列 </td></tr> <tr><td>3行一列 </td></tr> <tr><td>4行一列目 </td> <td>4行二列目 </td></tr> <tr><td colspan="2">5行一列           </td></tr> <tr><td colspan="2">6行一列           </td></tr></table>

    • ベストアンサー
    • HTML
  • forの中でforをループしてそれぞれ配列に格納したい

    お世話になります。 5レコードずつのデータをテーブルに吐き、テーブル自体を4個 横に並べて表示したいです。 ひとつめのforを使って最初の5行を取得しテーブルに収めることは できたのですが、6-10行目のレコードは、また同じようなforを 書いて、隣のテーブルに書かないといけないでしょうか。 配列の引数に配列もしくは変数を用いて書けば、何度も同じような コードを書かなくて済むと思ったのですが、記述しても膨大な 計算をしているらしく、タイムアウト?か、真っ白な画面を出して きます。 No 氏名 No 氏名 No 氏名 1 山田  6 川田  11 谷田 2 山下  7 川上  12 谷川 3 山本  8 川本  13 谷本 5行まで 要するに、1つのテーブルがいっぱいになったら(ここでは5行) となりのテーブルに行ってほしいのです。1-5を第1テーブル、 6-10を第2テーブル・・・とすると、第1と第2のコードはループ 2回で取れないでしょうか。 $start = 0; for ($A = 0; 3; $A++){  //テーブル4個分のループ //1テーブル5行分のループ for ($recno = $start + ($A * 5); $recno < $start + 5 + ($A * 5); $recno++){ if (! $row =& $res->fetchRow(db_fechtmode_assoc,$recno)) { break; } $body['$A'].="<tr>"; $body['$A'].="<td>".$row["No"]."</td>"; $body['$A'].="<td>".$row["氏名"]."</td>"; $body['$A'].="</tr>\n"; } } で、$body[0]の第1テーブルを書き出し、$body[1]の第2テーブルを 書き出し・・・と、そのまま使えたら楽だと思ったのです。 そもそも、$body[0]の中にはNoと氏名とは2つ入らないでしょうか・・・。 PHP5.2.6 と PEAR です。よろしくお願いします。

    • ベストアンサー
    • PHP
  • データベースの中身をテーブルで表示したいです

    mysqlデーターベースの中身をテーブルで表示したいのですがわからない事があるので書き込みしました。 テーブルAのデーターを <TABLE> <TR><TD>mysql1行目</TD><TD>mysql2行目</TD></TR> <TR><TD>mysql2行目</TD><TD>mysql4行目</TD></TR> </TABLE> <TD></TD>の間にレコード一つ分のデータを入れて2列で表示したいです。 whileを使ってデーターを取り出すと1行にレコード一つ分のデーターを表示するのはそのままできるんですが1行にレコード二つ分のデーターを出す場合<TR>と</TR>をどういう仕組みで表示させれば良いかわかりません。 誰か教えてもらえないでしょうか?

    • 締切済み
    • PHP
  • CGIのフォームメールで送信した値をTABLEで表示しています。横二列ではなく、一部、横五列に変更したい

    Perlで書いたCGIプログラムを使って、申し込みフォームを作成し、送信先をOutlookExpressのメーラーにしてHTML形式で表示しています。 サーバーはLINUX、メールを見ているPCはWindows98SEです。 CGIのプログラムはサンプルを使用しましたが、たいていのサンプルは、 フォームのnameの値とvalueの値を順に並べています。 foreach (0..$count-1) { print OUT "<TR><TD>$DATA_N[($_)]</TD><TD>$DATA_V[($_)]</TD></TR>\n"; } という具合にです。 ($DATA_N[($_)]はnameの値で、$DATA_V[($_)]がvalueの値です。) でも、この場合だとTABLEも横二列のものをずらっと並べるだけになってしまいます。一部、横五列に変更したいのですが。。 その場合は、フォームメールから送られるnameとvalueの値を順に並べるのではなく、それぞれ送信するデータに値をつけ、テーブルに入れ込む形になると思うのですが、いまいち、プログラムが分かりません。 私はCGIの初心者なので、いつもCGIのサンプルを使用し、一部変更しながら活用しています。なので、最初からCGIを書くとなると、どうも分からなくなってしまいます。 どなたかアドバイスお願いします。 できれば、プログラムも書いて教えて頂けると有り難いです。 参考にしたのは、下記のアドレスのものです。 (但し、これはテキスト形式で送信されています) http://www.rescue.ne.jp/cgi/webform/

    • ベストアンサー
    • CGI
  • 入力フォームに半角スペース以降が表示されない

    Perlでプログラムを組んでいます。 「山田 太郎」とデータを書き込みました。 それを$nameという変数に入れてPerlで出力し、 HTMLのフォームで表示しようとすると 「山田」までしか表示されません。 フォーム以外ではちゃんと「山田 太郎」と表示されます。 入力フォームはINPUTTYPE=text maxlength=20 です。 スクリプトは以下のような感じです。 HTML出力部分のみ。 # フォームからの情報を連想配列 %form に入れる &init_form($kanjicode) ・・・・ print <<"EOD"; Content-type: text/html <HTML> <HEAD> $contenttype <TITLE>$title</TITLE> </HEAD> <body> $tabletag <UL> <LI>$nameさんパスワードは大文字小文字の違いに注意してください。</LI> ↑「山田 太郎」とちゃんと表示される </UL> <FORM ACTION=$thisurl METHOD=$method> <TABLE> <TR> <TD>氏名</TD> ↓ここでは「山田」までしか表示されない <TD><INPUT type=text size=20 maxlength=20 name=$name value=$name></TD> </TR> <TR> <TD>パスワード</TD> <TD><INPUT type=password size=4 maxlength=4 name=pass value=$pass></TD> </TR> <TR> <TD COLSPAN=2> <INPUT type=hidden name=cmd value=new2> <INPUT type=submit value=登録する> </TD> </TR> </TABLE> </FORM> </BODY></HTML> EOD なにかヒントがありましたら教えてください。

    • ベストアンサー
    • Perl
  • データのidの多い順に書き出す

    ぜひご教授ください。 データをhtmlに、ジャバスクリプトで表にしようとしています。 その際、ジャバスクリプトファイルとデータは別ファイル化することを前提にしています。 具体には、a.jsは、テーブルの書き出しを想定し、次のように書き込んでいます。 //テーブル書き出し html = '<table width="195px">' for (i=0;i<data.length-1;i++) { html += ' <tr>' html += ' <td> ' +data[i]+ ' </td>' html += ' </tr>' } html += '</table>' //書き出し document.write( html ) //--> そして、b.jsはデータファイルとし、次のように書き込んでいます。 var data = new Array() data[0] = "aaaaa" data[1] = "bbbbb" で、これをhtmlに表示させると、aaaaaの下にbbbbbが来るわけですが、考えているのは、データを足していき、htmlの表示は、新しい順にならべたいと考えているため、これでは不服なのです。 いちいち、データファイルに足す際、data[*]を全部書き換えるのも嫌なので、そのまま、*は大きいものを足すだけで、それでいてhtmlの方は*の大きい方から表示する…。 そうするには、どこをどういじればよいのでしょうか。 本気で困っています。 よろしくお願いいたします。

  • テーブルを横に二つ並べて表示する方法はありますか?

    テーブルを横に二つ並べて表示する方法はありますか? 4列のテーブルを作るのではなく、 2列のテーブルを2個並べたいです。 <html> <head> <title>test</title> </head> <body> <table border=1 cellspacing=1 cellpadding=1> <tr><td>No</td><td>Destination</td></tr> <tr><td>a</td><td>b</td></tr> </table> <table border=1 cellspacing=1 cellpadding=1> <tr><td>No</td><td>Destination</td></tr> <tr><td>a</td><td>b</td></tr> </table> </body> </html> これだと、縦に2個並んでしまいます。

  • DHTMLでテーブルの行の表示・非表示を切り替える。

    こんにちは。 WEBアプリケーションのモックアップを作成しています。 自身はJava屋ですが、DHTMLに明るくないため、苦戦しています。 同一画面内のリンクがクリックされた場合に・・・ テーブルの行の表示、非表示を切り替えたいのです。 <!-- ========================= --> <!-- テーブル1 --> <table border="1"> <tr> <td>ヘッダ1</td> <td>ヘッダ2</td> </tr> <!-- ☆☆☆ ここから ☆☆☆ --> <tr> <td>111</td> <td>aaa</td> </tr> <tr> <td>222</td> <td>bbb</td> </tr> <!-- ☆☆☆ ここまで消したい ☆☆☆ --> </table> <!-- テーブル2 --> <table border="1"> <tr> <td>ヘッダA</td> <td>ヘッダB</td> </tr> <tr> <td>あああ</td> <td>いいい</td> </tr> </table> <!-- ========================= --> <tr>タグを<div>タグで囲んで、styleでhidden、visibleを切り替えようと考えましたが、<tr>に<div>タグが使えない事を知りました。 そこで、テーブル1を大きくテーブルで囲み、ヘッダとボディ部をセルに入れて、セルの表示・非表示を切り替えました。 これは上手くいったのですが、非表示にした場合、テーブル2との間は詰まるようにしたいのですが、もともと表示されていた分のスペースが出来てしまいました。 あまり、ロジックを組み込まずに作ろうと考えているのですが、上手い方法が思いつきません。 何か良い方法がありましたら、ご教授願います。 ターゲットのブラウザは… IE5.5~IE7 です。

    • ベストアンサー
    • HTML
  • csvデータをテーブル表示させる

    再び新規質問で申し訳ありません これしか方法がわからなかったもので; csvデータから最初の項目に5というものが含まれている場合 その列を表示する、というのを先ほど質問させていただいて解決に至りました。 csvデータファイルの内容 5,データ1,データ1の説明 5,データ2,データ2の説明 5,データ3,データ3の説明 6,データ4,データ4の説明 ・・・ ↓ open(IN, "data.csv"); while (<IN>) { if ((split(/,/))[0] == 5) { print $_. "\n"; } } close(IN); これで最初の欄に5が含まれている列だけ表示されるのですが htmlに出力すると、そのまま下記のように表示されます 5,データ1,データ1の説明 5,データ2,データ2の説明 5,データ3,データ3の説明 これでは余りにみずらいので、以下のように変更しました open(IN, "data.csv"); print "<table>"; while (<IN>) { if ((split(/,/))[0] == 5) { print "<tr><td>". $_. "</td></tr>"; } } </table> close(IN); これで少しは見やすくなったのですが・・・ ↓のように。 5,データ1,データ1の説明 5,データ2,データ2の説明 5,データ3,データ3の説明 この,で区切られた部分も</td><td>で表示したいのですがうまくいきません。 先ほど質問した時に教えていただいたURLを参照しましたがサッパリでした; 検索で、csvファイルをリストに格納して print "<table><tr>"; print "<td>$data_view[0]</td>"; print "<td>$data_view[1]</td>"; print "<td>$data_view[2]</td>"; print "</tr></table>"; と表示させれば良い、という記事をみつけたのですが これをすると 先ほど成功した最初のデータに5が一致した分だけ表示させる、という部分が機能しませんでした;; まだまだ勉強不足かとは思いますが何卒お願い致します

    • ベストアンサー
    • Perl
  • ページ変遷後の画面の表示方法

    お世話になります。 PHPを始めて2週間ほどになります。 プロフのようなものを作りたいと思っています。 今回質問したいのは、検索フォームからMYSQLにあるデータを引き出し、結果一覧をHTMLに出力した後、リンクをクリックして詳細画面を表示するには?ということです。 MYSQLのフィールドに画像のファイル名を格納し検索後、呼び出すときに<a href="">や<img src="">で画像のみを表示させたり、事前に作ったHTMLを表示させることはできるのですが、リンクをクリックした後に定型のヘッダやフッタの間に画像や説明文を入れたり、データベースから文字を引き出して表示させる方法がわかりません。 postやgetで情報を次のページに渡して、PHPの中で生成していくのかなぁ??なんて思ったりはしたのですが、さっぱりなんです。 また、ケータイからでも表示できる内容にしたいです。 以下は作りかけのソースなのですが、検索フォームからPOSTされた文字列で検索して表示はできました。 このあとどう修正して良いのかわかりませんでした。 <html> <body> <? $id = $_POST['id']; if($id == ""){ print "検索キーワードが入力されていません。"; print "ブラウザの戻るでお戻りください。"; break; } $s = mysql_connect("*****","*****","*****") or die ("接続エラー"); mysql_select_db("*****",$s); $result = mysql_query ("SELECT * FROM test where name LIKE '%$id%'") or die ("見つかりません"); include "header.php"; while ($rows = mysql_fetch_array ($result)) { $no = $rows[0]; $name = $rows[1]; $pic = $rows[2]; $com = $rows[3]; print "<table width=\"230\" border=\"1\">"; print "<tr>"; print "<br><td width=\"70\">会員番号</td>"; print "<td width=\"144\"><a href=\"$no\">詳細</a></td>"; print "</tr>"; print "<tr>"; print "<td>ニックネーム</td>"; print "<td>$name</td>"; print "</tr>"; print "<tr>"; print "<td>画像</td>"; print "<td><a href=\"$pic\">画像リンク</a></td>"; print "</tr>"; print "<tr>"; print "<td>コメント</td>"; print "<td>$com</td>"; print "</tr>"; print "</table>"; } print "<br>"; include "footer.php"; ?> </body></html> 非常に困って次に進めない状態です。ヒントや参考になるサイト、また修正など教えていただければありがたいです。 わかりにくい文章になってしまいましたが、よろしくお願いします。

    • 締切済み
    • PHP

専門家に質問してみよう