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

4841

  • 0P

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

質問日時 / 2017年5月8日 14:59 (最終編集:5月8日 15:28)    回答数 / 4件

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

キーワード / キーワードが設定されていません

04/17データの表示方法引き続きの質問になります

20日のデータは問題なく表示されています
今回は平均(Av)のデータ表示についてご教授下さい

下記の様な形式で表示させたい。
年の平均も表示させる

年、組、名前 11 10  09  08  07  Av
0101AA    3    5    3     2    2   3.0   
0102AB    1    2           2    3   2.0
平均                                                2.6

生徒によっては欠席の場合もあるのでアンケートに答えた回数で平均を表示させる
上記サンプルの「年」平均2.6は合計を答えた回数で割った数値を表示させています。

お手数をお掛けしますが上記内容での表示方法をご教授下さいますよう宜しくお願いします。

他の問題として
20日間のデータ表示させていますが、01〜21を表示させる場合
21 20 19 〜 02 を表示させたいが
20 19 18 〜 01 で表示されてしまう。

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



ツリー一覧

┗A01shimix出力結果だけ合わせるなら何てことも無いと思うのです
 ┗A01-1web_nakashimixさん 早速の返事ありがとうございます。 出
  ┗A01-1-1shimixあぁ(同じタイトルの)あの質問の流れですね(汗
   ┗A01-1-1-1web_nakaShimix様 返事ありがとうございます。 前の回答と

回答一覧

並び替え:

A01
answerershimix [5月8日 18:36] (最終編集:5月8日 18:43)

出力結果だけ合わせるなら何てことも無いと思うのですが、元データはどういう形式なんでしょうか?

>20日間のデータ表示させていますが、01〜21を表示させる場合
>21 20 19 〜 02 を表示させたいが
>20 19 18 〜 01 で表示されてしまう。

21日のデータが存在していないのですかね?存在していれば表示されないハズはないですよね。横(列方向)が可変ですから、全データを読込んだあとで最大の日から(過去に向かって)20日間の枠を決めて出力していくと思いますが・・・

読込んだデータの最終日付から20日分という条件なら、下記のように書けると思います。多少力技ですが(汗
  1. <?php
  2. // DBから読込むと仮定するデータ
  3. $data = array();
  4. $data[] = array('name'=>'A''ymd'=>'2017/05/01''val'=>2);
  5. $data[] = array('name'=>'A''ymd'=>'2017/05/03''val'=>3);
  6. $data[] = array('name'=>'A''ymd'=>'2017/05/05''val'=>2);
  7. $data[] = array('name'=>'A''ymd'=>'2017/05/07''val'=>3);
  8. $data[] = array('name'=>'A''ymd'=>'2017/05/09''val'=>2);
  9. $data[] = array('name'=>'A''ymd'=>'2017/05/11''val'=>3);
  10. $data[] = array('name'=>'A''ymd'=>'2017/05/13''val'=>2);
  11. $data[] = array('name'=>'A''ymd'=>'2017/05/15''val'=>3);
  12. $data[] = array('name'=>'A''ymd'=>'2017/05/17''val'=>2);
  13. $data[] = array('name'=>'A''ymd'=>'2017/05/19''val'=>3);
  14. $data[] = array('name'=>'A''ymd'=>'2017/05/21''val'=>2);
  15.  
  16. $data[] = array('name'=>'B''ymd'=>'2017/05/02''val'=>2);
  17. $data[] = array('name'=>'B''ymd'=>'2017/05/04''val'=>3);
  18. $data[] = array('name'=>'B''ymd'=>'2017/05/06''val'=>4);
  19. $data[] = array('name'=>'B''ymd'=>'2017/05/08''val'=>5);
  20. $data[] = array('name'=>'B''ymd'=>'2017/05/10''val'=>6);
  21. $data[] = array('name'=>'B''ymd'=>'2017/05/12''val'=>7);
  22. $data[] = array('name'=>'B''ymd'=>'2017/05/14''val'=>8);
  23. $data[] = array('name'=>'B''ymd'=>'2017/05/16''val'=>9);
  24. $data[] = array('name'=>'B''ymd'=>'2017/05/18''val'=>10);
  25. $data[] = array('name'=>'B''ymd'=>'2017/05/20''val'=>11);
  26.  
  27.  
  28. // 読込んで溜め込む
  29. $day = array()// 日付列用
  30. $tbl = array()// データ用
  31. foreach ($data as $row) {
  32.   $name = $row['name'];
  33.   $ymd = strtotime($row['ymd']);
  34.   $val = $row['val'];
  35.   $tbl[$name][$ymd] = $val;
  36.   if (!in_array($ymd$day)) { $day[] = $ymd}
  37. }
  38.  
  39. // 日付列(最終日から最大20日分)を定義
  40. rsort($day);
  41. $col = array();
  42. do {
  43.   $col[] = array_shift($day);
  44. } while ((count($day) > 0)&&(count($col) < 20));
  45.  
  46. // 出力
  47. $ctg = 0;
  48. $ptg = 0;
  49. $th = false;
  50. foreach ($tbl as $name=>$row) {
  51.   if (!$th) {
  52.     $th = true;
  53.     echo '<table><tr><th>NAME</th>';
  54.     foreach ($col as $dd) { printf('<th style="width:20px">%s</th>'date('j'$dd))}
  55.     echo '<th>Ave.</th>';
  56.     echo '</tr>' . PHP_EOL;
  57.   }
  58.   $ct = 0;
  59.   $pt = 0;
  60.   printf('<tr><td>%s</td>'$name);
  61.   foreach ($col as $dd) {
  62.     if (isset($row[$dd])) {
  63.       printf('<td style="text-align:right">%d</td>'$row[$dd]);
  64.       $ct += 1;
  65.       $pt += $row[$dd];
  66.     } else {
  67.       echo '<td style="text-align:right">&nbsp;</td>';
  68.     }
  69.   }
  70.   printf('<td>%.2f</td>'$pt / $ct);
  71.   $ctg += $ct;
  72.   $ptg += $pt;
  73.   echo '</tr>' . PHP_EOL;
  74. }
  75. if ($th) {
  76.   echo '<tr><td></td>';
  77.   foreach ($col as $dd) { echo '<td></td>'}
  78.   printf('<td style="text-align:right">%.2f</td>'$ptg / $ctg);
  79.   echo '</tr>' . PHP_EOL;
  80.   echo '</table>';
  81. }

この意見に回答する

ツリーへ TOPへ

A01-1
replyerweb_naka [5月8日 20:21]

shimixさん
早速の返事ありがとうございます。

出力結果だけ合わせるなら何てことも無いと思うのですが、元データはどういう形式なんでしょうか?
>下記の様なレイアウトになります。
DB:rikaido
level、class、name、test、date
01         01        AA        5   20170410
01         02        AB        2   20170410
01         01        AA        3   20170411
01         02        AB        1   20170411


21日のデータが存在していないのですかね?存在していれば表示されないハズはないですよね。横(列方向)が可変ですから、全データを読込んだあとで最大の日から(過去に向かって)20日間の枠を決めて出力していくと思いますが・・・
>前回教授頂いたif (count($col_arr) === 20)の20を19に変更すると直近のデータが非表示になりました。

前回は日付が 04-27 04-28 04-29 〜の様に表示されていましたが今回のソースは日付のみの表示になって表示も 08 07 06 05の様に表示される仕様になってますね!

日付の表示は今回の仕様で問題ありません。

質問の中にDBの形式を記載していなかったためshimixさんにてnameのみでソースを書いていただいていますが、データの「level」「class」を追加するとソースはどのようになりますでしょうか?

お手数おかけしますが宜しくお願いします。

この意見に回答する

ツリーへ TOPへ

A01-1-1 満足
replyershimix [5月9日 10:41] (最終編集:5月9日 10:42)

あぁ(同じタイトルの)あの質問の流れですね(汗

>前回教授頂いたif (count($col_arr) === 20)の20を19に変更すると直近のデータが非表示になりました。

SQL文に「order by 日付 desc」と書いいるので直近のデータが抜けることは考えにくいのですけどね(テストデータで試した限りでは問題なく動作する)。
order by 日付 desc なので、データが存在する日付は新しい日付から全部網羅できているハズです。



>データの「level」「class」を追加するとソースはどのようになりますでしょうか?

前の回答と同じように、lavel,class,nameを繋げてブレークキーにするのがいいと思います。
  1. $id = $row['level'] . $row['class'] . $row['name'];
  2. $name = $row['name'];
  3. $ymd = strtotime($row['ymd']);
  4. $val = $row['val'];
  5. $tbl[$id]['name'] = $name;
  6. $tbl[$id][$ymd] = $val;
当然使っている部分も書き替えになります(名前の取り出しがちょっと面倒にはなります)が、そのくらいは書けますよね。それも書けないとなると「丸投げ」ということになりますので(というか現状ですでに丸投げに等しい状態ですが)。



>日付の表示は今回の仕様で問題ありません。

そのあたりは基本的にご自分で変更してください。(私は)掲示板の回答では細部まで(提示されてもいない)仕様を優先したりしません。デバッグのやりやすさ(表示から動作の正当性が推測しやすい)を考えながら書いたりしますので、お好きなように書き替えて使ってもらえればと思います。
というか「細部まで仕様どおり」を要求するなら対価が発生しますよ(苦笑

この意見に回答する

ツリーへ TOPへ

A01-1-1-1
replyerweb_naka [5月9日 14:09]

Shimix様
返事ありがとうございます。

前の回答と同じように、lavel,class,nameを繋げてブレークキーにするのがいいと思います。
当然使っている部分も書き替えになります(名前の取り出しがちょっと面倒にはなります)が、そのくらいは書けますよね。それも書けないとなると「丸投げ」ということになりますので(というか現状ですでに丸投げに等しい状態ですが)。

>無事表示可能になりました。

というか「細部まで仕様どおり」を要求するなら対価が発生しますよ(苦笑

>本当に丸投げ状態で申し訳ございません。今後この様な指摘を受けないよう注意します。

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

この意見に回答する

ツリーへ TOPへ

<<質問一覧へ



Pick Up Q&A

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

>>続きを読む

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

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