データの表示方法について - PHPプロ!Q&A掲示板

4837

  • 0P

データの表示方法について

質問日時 / 2017年4月17日 20:14    回答数 / 4件

Questioner:  web_naka  このエントリーをはてなブックマークに追加 

キーワード / php    mysql   

下記の様なMysqlのデータを
DB:rikaido
年、組、名前、理解度、日付
01,01,AA,5,20170410
01,02,AB,2,20170410
01,01,AA,3,20170411
01,02,AB,1,20170411

年、組、名前 11 10
0101AA    3    5
0102AB    1    2

上記の様にphpを使用し表示させたい(過去20日分程度)
お手数お掛けしますがご教示下さいますようお願い致します

この質問への意見の募集は締め切られ、ポイントは既に配分されました。
意見を投稿することはできますが、ポイントを受け取ることはできません。



ツリー一覧

┗A01shimix「学生のID」は存在しないんでしょうか?普通の設計で
 ┗A01-1web_nakashimixさん 早速の返事ありがとうございます。 学生
  ┗A01-1-1shimix>のようにそれぞれのデータが列を作成しております
   ┗A01-1-1-1web_nakashimix様 検証までして頂き誠にありがとうございます

回答一覧

並び替え:

A01
answerershimix [4月18日 10:34]

「学生のID」は存在しないんでしょうか?普通の設計ではIDがないというのは考えにくいのですが・・・。

#以下、年・組・名前で特定するという前提で
  1. <?php
  2. // DBへの接続処理など
  3.  
  4. $col_arr = array()// 列の日付の配列
  5. $out_arr = array()// 出力データの配列
  6.  
  7. $stmt = $pdo->query('select * from テーブル名 order by `日付` desc');
  8.  
  9. while ($row = $stmt->fetch()) {
  10.   $dd = $row['日付'];
  11.   // 新しい日付か?
  12.   if (!in_array($dd$col_arr)) {
  13.     // 20日分あったら(21日めだったら)終了
  14.     if (count($col_arr) === 20) { break}
  15.     $col_arr[] = $dd;
  16.   }
  17.   $id = $row[''] . $row[''] . $row['名前'];
  18.   if (!isset($out_arr[$id])) {
  19.     $out_arr[$id] = array(''=>$row['']''=>$row['']'名前'=>$row['名前']'理解度'=>array());
  20.   }
  21.   $out_arr[$id]['理解度'][$dd] = $row['理解度'];
  22. }
  23. if (count($out_arr) > 0) {
  24.   echo '<table>' . PHP_EOL;
  25.   echo '<tr><th>年</th><th>組</th><th>名前</th>' . PHP_EOL;
  26.   foreach ($col_arr as $val) { printf('<th>%s</th>'$val)}
  27.   echo '</tr>';
  28.  
  29.   foreach ($out_arr as $val) {
  30.     echo '<tr>';
  31.     printf('<td>%s</td><td>%s</td><td>%s</td>'$val['']$val['']$val['名前']);
  32.     foreach ($col_arr as $col) {
  33.       $colw = isset($val['理解度'][$col]) ? $val['理解度'][$col] : '&nbsp;';
  34.       printf('<td>%s</td>'$colw);
  35.     }
  36.     echo '</tr>' . PHP_EOL;
  37.  
  38.   }
  39.   echo '</table>' . PHP_EOL;
  40. }

この意見に回答する

ツリーへ TOPへ

A01-1
replyerweb_naka [4月18日 16:29]

shimixさん
早速の返事ありがとうございます。
学生IDの指摘ありがとうございます。

表示については問題なくできております。
ありがとうございます。

表示の方法ですが
現状
年組名前   20170418 20170418 20170418  20170417
0101AA           1                                                    3
0102AB                                  3
0103AC                                             2
のようにそれぞれのデータが列を作成しております

それを
年組名前   0418 0417
0101AA               1       3
0102AB              3
0103AC              2
上記の様に日付で列を作成し表示させたい
列は0418 0417 0416と過去に遡るように表示させる

上記の内容で再度ご教示下さいますよう宜しくお願いします。

この意見に回答する

ツリーへ TOPへ

A01-1-1 満足
replyershimix [4月18日 16:46] (最終編集:4月18日 18:31)

>のようにそれぞれのデータが列を作成しております

え?私の環境では、最初にweb_nakaさんが例示された表示のとおりになっていますけどね(違うのは日付をフル桁表示している部分だけ)。横方向への配列の並びは
  1. if (!in_array($dd, $col_arr)) {
  2.     // 20日分あったら(21日めだったら)終了
  3.     if (count($col_arr) === 20) { break; }
  4.     $col_arr[] = $dd;
  5. }
で制御出来ているハズです。理解度の保存も、$out_arr[$id]['理解度'][$dd] = $row['理解度']; と $dd($row['日付'])を添え字にしているし・・・

ひょっとして、カラム「日付」が日時だったりはしませんか(それだとヘッダの表示が変わりそうなものですが・・・)。もしそうなら $dd = $row['日付']; の部分で、年月日(もしくは月日)だけを $dd に切り出して使ってください。


(追記)
下記はデータベースから読込む代わりに、配列を処理するように書き替えたものです。これで動作確認できると思います(実際には手元のMySQLでも動作確認していますが「データが違う」というオチは避けたいので)。
  1. <?php
  2. $rows = array();
  3. $rows[] = array(''=>'01'''=>'01''名前'=>'AA''理解度'=>1'日付'=>'20170418');
  4. $rows[] = array(''=>'01'''=>'02''名前'=>'AB''理解度'=>3'日付'=>'20170418');
  5. $rows[] = array(''=>'01'''=>'03''名前'=>'AC''理解度'=>2'日付'=>'20170418');
  6. $rows[] = array(''=>'01'''=>'01''名前'=>'AA''理解度'=>3'日付'=>'20170417');
  7.  
  8. $col_arr = array()// 列の日付の配列
  9. $out_arr = array()// 出力データの配列
  10.  
  11. foreach ($rows as $row) {
  12.   $dd = $row['日付'];
  13.   // 新しい日付か?
  14.   if (!in_array($dd$col_arr)) {
  15.     // 20日分あったら(21日めだったら)終了
  16.     if (count($col_arr) === 20) { break}
  17.     $col_arr[] = $dd;
  18.   }
  19.   $id = $row[''] . $row[''] . $row['名前'];
  20.   if (!isset($out_arr[$id])) {
  21.     $out_arr[$id] = array(''=>$row['']''=>$row['']'名前'=>$row['名前']'理解度'=>array());
  22.   }
  23.   $out_arr[$id]['理解度'][$dd] = $row['理解度'];
  24. }
  25. if (count($out_arr) > 0) {
  26.   echo '<table>' . PHP_EOL;
  27.   echo '<tr><th>年</th><th>組</th><th>名前</th>' . PHP_EOL;
  28.   foreach ($col_arr as $val) { printf('<th>%s</th>'$val)}
  29.   echo '</tr>';
  30.  
  31.   foreach ($out_arr as $val) {
  32.     echo '<tr>';
  33.     printf('<td>%s</td><td>%s</td><td>%s</td>'$val['']$val['']$val['名前']);
  34.     foreach ($col_arr as $col) {
  35.       $colw = isset($val['理解度'][$col]) ? $val['理解度'][$col] : '&nbsp;';
  36.       printf('<td>%s</td>'$colw);
  37.     }
  38.     echo '</tr>' . PHP_EOL;
  39.   }
  40.   echo '</table>' . PHP_EOL;
  41. }

この意見に回答する

ツリーへ TOPへ

A01-1-1-1
replyerweb_naka [4月18日 20:44]

shimix様
検証までして頂き誠にありがとうございます。

連絡が遅くなり申し訳ございません。
Firefoxにて検証を行うと問題なく表示できました。

業務上Safariを使用しているためSafariでの検証の結果を投稿させていただきました。

SafariについてはCacheを削除することで改善できました。

色々有り難うございました。

この意見に回答する

ツリーへ TOPへ

<<質問一覧へ



Pick Up Q&A

Q
ログファイルの中の空のデータ行を削除したい
 このエントリーをはてなブックマークに追加 
A
ログのデータ個数(列数)が固定で、空のログが"<><><>"だと既知であれば if ($line === "<><><>") { continue; } で読み飛ばしてもいいのでは? ...

>>続きを読む

まずは配列や文字列の扱いから、じっくり勉強して行きましょう。

▲解説者:岡本(アシアル株式会社 教育コーディネーター兼 システムエンジニア)

Q&A掲示板 新着情報