Pear::Image_Graph その2

グラフ値表示ファイル作成

それでは、グラフ値表示ファイル p_gra_table.php を作成します。
作成ファイル内容は、
63Pear Village に戻り
左サイドナビ「Pear::Image_Graph その2」の中の
グラフ値表示 PHP ファイル
から見てください。

CSV ファイルの読み込み

最初に CSV ファイルを読み込みます。
$filepath = "file/p_gra_samp.csv";
ファイルのあるフォルダ名とファイル名を設定します。
そしてインスタンスを定義します。
$file = new SplFileObject($filepath);
次ぎに、CSV 列として行を読み込みができるようにフラグをセットします。
$file -> setFlags(SplFileObject::READ_CSV);
これで指定した CSV ファイルからのデ-タが取得可能となります。
$file の中にはオブジェクトとして CSV ファイルからのデ-タが格納されますので ここから配列として読み出します。
foreach は、配列を反復処理するための便利な方法です。
foreach が使えるのは配列とオブジェクトだけであり、 別のデータ型や初期化前の変数に対して使うとエラーになります。
foreach ($file as $key => $line)
と書くと各反復において現在の要素の値が $line に代入され、 さらに現在の要素のキーを変数 $keyに代入します。
そして、 内部配列ポインタが一つ前に進められます。
よって、次の反復では次の要素を見ることになります。
もし、
foreach($line as $str)
と書くと各反復において現在の要素の値が $strに代入され、 内部配列ポインタが一つ前に進められます。

  foreach($file as $key=>$line){
   foreach($line as $str){
    $str1 = mb_convert_encoding
     ($str,"UTF-8","sjis-win"); 
    $records[$key][] = $str1; 
   }
  }

具体的には $key は 0~1~2~3~ のように変化していきます。
例えば $key = 1 のとき
$records[$key][1] = 月
となります。

文字化け防止

前項 CSV ファイルの読み込み過程で
$str1 = mb_convert_encoding
 ($str,"UTF-8","sjis-win");
なる変な命令がありますね。
これは文字化け防止のためのものです。
エクセルで CSV ファイルを作成すると文字コ-ドは SHIFT-JIS で保存されるのです。
正確に言うと sjis-win で保存されているようです。
だから UTF-8 に変換しないと WEB で表示すると文字化けしてしまいます。
文字エンコーディングを変換命令の書式は
mb_convert_encoding(
 変換する文字列,
 変換後の文字エンコーディング,
 変換前の文字エンコーディング名)
です。
でも今回は少し注意が必要です。
変換前の文字エンコーディング名は、SHIFT-JIS ではなく sjis-win としなければ完全なる文字化け防止にはならないようです。
sjis-win の方が文字が多いようです。
よく使うところでは、下記のような文字は sjis-win にはありますが SHIFT-JIS にはありません。
• 丸数字 (①②③...⑳)
• ローマ数字 (ⅠⅡⅢ...Ⅹ、ⅰⅱⅲ...ⅹ)
• カッコ付きの株 (㈱)
• はしご高[はしごたか] (髙)
• たつ崎[たつさき、たちさき] (﨑)
でもエクセルではこれらの文字も使用可能です。
なので、エクセルの文字書式は、sjis-win だろうと推定しています。

テ-ブルタグ全出力

それでは、テ-ブルタグを echo 文で出力して一覧表全部を作成します。
まずはタグ <table>・・・・</table> を出力します。
次ぎに横1列のデ-タを出力する行を作るために都合8回タグ <tr>・・・・</tr> を出力します。
そして横1列のタグ <tr>・・・・</tr> ごとに、都合7回 <td>$records[][]</td> を出力します。
これで全 CSV デ-タの一覧表示は完了です。

  echo '<h3>PHP テ-ブル全表示</h3><table>'; 
  for ($i = 0; $i < 8; $i++) { 
  //縦デ-タ数 0~7 = 8個 
    echo '<tr>'; 
  for ($j = 0; $j < 7; $j++) { 
  //横デ-タ数 0~6 = 7個 
    echo '<td>'.$records[$i][$j].'</td>'; 
  } 
  echo '</tr>'; 
  } 

必要部分のテ-ブル表示

CSV ファイルの中にはグラフを作成するために必要なデ-タでグラフ値一覧表示には必要がないデ-タがあります。
この不要なデ-タを取り除いて一覧表を表示させます。
今回の例では、
[0][0]~[0][6]行 と
[0][0]~[7][0]列
は人が見た時に分かりやすくするためのもの、
[0][4]~[7][4]列
はグラフを作成するために必要なデ-タでグラフ値一覧表示には必要がありません。
まずはタグ <table>・・・・</table> を出力します。
次ぎに横1列のデ-タを出力する行を作るために都合7回タグ <tr>・・・・</tr> を出力します。
最初の横1列のデ-タは、人が見た時に分かりやすくするためのものでした。
よって、for 文は $i = 1 から始めればよいはずです。
そして、$i = 1 のときは、太線で列を囲めるよう
<tr class="tr1">
として、別途 CSS を用意します。
今回はこの CSS は作成しないので無視されます。
そして横1列のタグ <tr>・・・・</tr> ごとに、都合7回 <td>$records[][]</td> を出力します。
でも、[0][4]~[7][4]列 はグラフを作成するために必要なデ-タでグラフ値一覧表示には必要がありません。
そこで for 文のル-プ(カウンタ)変数 $j の他に第二のル-プ変数 $jj を用意し、

  for ($j = 1; $j < 6; $j++){
    $jj = $j; 
    if($j > 3){ 
    $jj = $j+1;
    }
    ・・・・・・・
  }

とします。
こうすると、1,2列目を表示した後、3列目はパスして4,5列目を表示します。
そして、1列目は太字で表示するよう

  if($i == 1){ 
    echo '<th>'.$records[$i][$jj].'</th>'; 
    }else{ 
    echo '<td>'.$records[$i][$jj].'</td>'; 
  } 

とします。
これで、グラフ値表示ファイル作成は完了です。
引き続き、グラフ値表示ファイルの動作確認をします。


グラフ値表示ファイル動作確認 に続く
グラフ値表示概要 に戻る

63Pear Villageに戻る