ポンクソフト

アンケートで円グラフ - PHPでGDを使ってみよう

前ページ PHPでGDを使ってみよう TOP 

目次

  1. PHPでGDを使ってみよう
  2. GDの基本
  3. フォームとの連動
  4. アンケートで円グラフ

アンケートフォームで円グラフを表示する

GD の機能を利用して、フォームからのアンケート結果を円グラフで表示するプログラムを作成します。

プログラムの作成

以下のソースを入力してください。
<?php
$color = array(
  array('赤', 255, 0, 0),
  array('黄', 255, 255, 0),
  array('緑', 0, 255, 0),
  array('水', 0, 255, 255),
  array('青', 0, 0, 255),
  array('紫', 255, 0, 255),
);
$ed = file('gdenq.txt');
for ($i = 0; $i < count($color); $i++) $ed[$i] = rtrim($ed[$i]);

// 画像表示時の処理
if ($_GET['image'] == 'yes') {
  $sum = 0;
  for ($i = 0; $i < count($color); $i++) $sum += $ed[$i];
  $ad = 0;
  $deg = array(270);
  for ($i = 0; $i < count($color); $i++) {
    $ad += $ed[$i];
    $deg[$i + 1] = (int)(($ad / $sum) * 360) + 270;
  }
  header("Content-Type: image/png");
  $img = imagecreate(200, 200);
  imagecolorallocate($img, 255, 255, 255);
  for ($i = 0; $i < count($color); $i++) {
    $c = $color[$i];
    $col = imagecolorallocate($img, $c[1], $c[2], $c[3]);
    imagefilledarc($img, 100, 100, 190, 190, $deg[$i], $deg[$i + 1], $col, IMG_ARC_PIE);
  }
  imagepng($img);
  exit();
}

// 投票時の処理
if ($_POST['submit']) {
  $ed[$_POST['cn']]++;
  $fp = fopen('gdenq.txt', 'w');
  for ($i = 0; $i < count($color); $i++) {
    fwrite($fp, $ed[$i] . "\n");
  }
  fclose($fp);
}
?>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html lang="ja">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=Shift_JIS">
<title>アンケート</title>
</head>
<body>
<form method="post" action="gdenq.php">
あなたが好きな色は?<br><br>
<?php
for ($i = 0; $i < count($color); $i++) {
  print "<input type='radio' name='cn' value='$i'>{$color[$i][0]}<br>\n";
}
?>
<br>
<input type="submit" name="submit" value="投票">
</form>
<img src="gdenq.php?image=yes"><br>
<?php
for ($i = 0; $i < count($color); $i++) {
  print "{$color[$i][0]} {$ed[$i]} 票<br>\n";
}
?>
</body>
</html>
入力が終わったら「gdenq.php」というファイル名で保存し、サーバにアップしてください。

データファイルの作成

次に、アンケートの結果を格納するデータファイルを作成します。「gdenq.txt」という名前の新規テキストファイルを作成し、以下のように入力してください。
1
1
1
1
1
1
その後、サーバにアスキー転送モードでアップし、ファイルの属性変更から「その他」に書込許可属性を与えてください。

実行

gdenq.php をブラウザで実行し、実際に投票ができるか確認してみてください。

ソースの解説

$color = array(
  array('赤', 255, 0, 0),
  array('黄', 255, 255, 0),
  array('緑', 0, 255, 0),
  array('水', 0, 255, 255),
  array('青', 0, 0, 255),
  array('紫', 255, 0, 255),
);
配列 $color にアンケートの項目と色(赤・緑・青の輝度)が順番に入ります。PHP では配列の中に配列を入れ子にすることで、2次元配列のように使うことができます。上記の場合では、$color[0][0] → 赤、$color[0][1] → 255、$color[0][2] → 0、…のような2次元配列になります。
$ed = file('gdenq.txt');
gdenq.txt には、各アンケート項目の結果の値が改行区切りで入っています。それを配列 $ed に格納しています。
for ($i = 0; $i < count($color); $i++) $ed[$i] = rtrim($ed[$i]);
各行の改行が邪魔なので rtrim 関数によって削除しています。
if ($_GET['image'] == 'yes') {
画像を表示する場合は、if 文内の処理を行ないます。
  $sum = 0;
  for ($i = 0; $i < count($color); $i++) $sum += $ed[$i];
$sum に票数を全て加算したものを代入します。
  $ad = 0;
  $deg = array(270);
  for ($i = 0; $i < count($color); $i++) {
    $ad += $ed[$i];
    $deg[$i + 1] = (int)(($ad / $sum) * 360) + 270;
  }
配列 $deg には各アンケート項目に対する円弧の開始角度が入ります。GD で円弧を描画する場合、時計の 3 時の地点が 0 度になり、時計回りに角度が進んで行きます。円グラフなので 270 度を足して 12 時の地点から開始するようにしています。
$img = imagecreate(200, 200);
円グラフ用に 200 × 200 ピクセルの画像を作成します。
imagecolorallocate($img, 255, 255, 255);
円グラフの背景を白にします。
for ($i = 0; $i < count($color); $i++) {
各項目分の円弧を描画します。
    $c = $color[$i];
    $col = imagecolorallocate($img, $c[1], $c[2], $c[3]);
円弧の色を、各項目の色に設定しています。
imagefilledarc($img, 100, 100, 190, 190, $deg[$i], $deg[$i + 1], $col, IMG_ARC_PIE);
自項目の開始角度から次の項目の開始角度まで円弧を描画します。
  imagepng($img);
  exit();
画像を出力して、ここで終了します。
if ($_POST['submit']) {
投票ボタンが押されたときは if 文内の処理を行ないます。
$ed[$_POST['cn']]++;
ラジオボタンで選択された項目の値をひとつ増やしています。
  $fp = fopen('gdenq.txt', 'w');
  for ($i = 0; $i < count($color); $i++) {
    fwrite($fp, $ed[$i] . "\n");
  }
  fclose($fp);
データファイルを書き込み用にオープンし、新しい項目の値を一行ずつ書き込んでいます。
for ($i = 0; $i < count($color); $i++) {
  print "<input type='radio' name='cn' value='$i'>{$color[$i][0]}<br>\n";
}
アンケートの項目を選択するためにラジオボタンを表示している部分です。項目が選択されると、POST メソッドの変数 cn に選択された項目の番号(上から順に 0, 1, 2, 3, 4, 5)が入ります。
<img src="gdenq.php?image=yes"><br>
画像を表示するために、GET変数 image に yes を代入して自分自身を呼び出しています。
for ($i = 0; $i < count($color); $i++) {
  print "{$color[$i][0]} {$ed[$i]} 票<br>\n";
}
各項目と票数を出力しています。
前ページ PHPでGDを使ってみよう TOP 
このエントリーをはてなブックマークに追加 そっか0

このページに関するコメントをどうぞ

お名前:


wentgt
すべての
calltrackingsource.com 13s.info nhadeptrongoi.com kashinvestment.com csgo-butterfly.com anklebitergaming.com
csfire.pro envelopesstore.com ginastarmusic.com mp3-teca.com csgoodstakes.com
went.black 2pay4win.com appliancerepairsnearme.com oferta-netflix.com
techitax.com csprey.com lightshadowspace.com csboom.pro
投稿者
2017/01/25 00:08

初心者
メールソフトの設定ってどうやるのですか...
gmailに送りたいのですが...
2017/01/24 21:33

enveloptf
すべての
calltrackingsource.com 13s.info nhadeptrongoi.com kashinvestment.com csgo-butterfly.com anklebitergaming.com
csfire.pro envelopesstore.com ginastarmusic.com mp3-teca.com csgoodstakes.com
went.black 2pay4win.com appliancerepairsnearme.com oferta-netflix.com
techitax.com csprey.com lightshadowspace.com csboom.pro
投稿者
2017/01/24 21:23

paywinlv
すべての
calltrackingsource.com 13s.info nhadeptrongoi.com kashinvestment.com csgo-butterfly.com anklebitergaming.com
csfire.pro envelopesstore.com ginastarmusic.com mp3-teca.com csgoodstakes.com
went.black 2pay4win.com appliancerepairsnearme.com oferta-netflix.com
techitax.com csprey.com lightshadowspace.com csboom.pro
投稿者
2017/01/24 18:04

anklebitcw
すべての
calltrackingsource.com 13s.info nhadeptrongoi.com kashinvestment.com csgo-butterfly.com anklebitergaming.com
csfire.pro envelopesstore.com ginastarmusic.com mp3-teca.com csgoodstakes.com
went.black 2pay4win.com appliancerepairsnearme.com oferta-netflix.com
techitax.com csprey.com lightshadowspace.com csboom.pro
投稿者
2017/01/24 11:35

butterfxa
すべての
calltrackingsource.com 13s.info nhadeptrongoi.com kashinvestment.com csgo-butterfly.com anklebitergaming.com
csfire.pro envelopesstore.com ginastarmusic.com mp3-teca.com csgoodstakes.com
went.black 2pay4win.com appliancerepairsnearme.com oferta-netflix.com
techitax.com csprey.com lightshadowspace.com csboom.pro
投稿者
2017/01/24 03:37

nhadeptronmr
すべての
calltrackingsource.com 13s.info nhadeptrongoi.com kashinvestment.com csgo-butterfly.com anklebitergaming.com
csfire.pro envelopesstore.com ginastarmusic.com mp3-teca.com csgoodstakes.com
went.black 2pay4win.com appliancerepairsnearme.com oferta-netflix.com
techitax.com csprey.com lightshadowspace.com csboom.pro
投稿者
2017/01/23 20:39

nhadeptronlv
すべての
calltrackingsource.com 13s.info nhadeptrongoi.com kashinvestment.com csgo-butterfly.com anklebitergaming.com
csfire.pro envelopesstore.com ginastarmusic.com mp3-teca.com csgoodstakes.com
went.black 2pay4win.com appliancerepairsnearme.com oferta-netflix.com
techitax.com csprey.com lightshadowspace.com csboom.pro
投稿者
2017/01/23 15:24

sinforve
すべての
calltrackingsource.com 13s.info nhadeptrongoi.com kashinvestment.com csgo-butterfly.com anklebitergaming.com
csfire.pro envelopesstore.com ginastarmusic.com mp3-teca.com csgoodstakes.com
went.black 2pay4win.com appliancerepairsnearme.com oferta-netflix.com
techitax.com csprey.com lightshadowspace.com csboom.pro
投稿者
2017/01/23 12:46

calltrackju
すべての
cbbnews24.com
csgobooms.com
csgojoybets.com
incareersjobs.com
stcmidtenn.org
thewill.in
sakirkaratas.com
apexturnkey.in
medray.in
applevalleymarket.com
b8b90.com
danhhotgay.com
cstopstake.com
nsm.org.in
vov-fc.com
csgohugepots.com
eaglesapparelshop.com
mymobileappmobiappssub2016.com
sbppl.org
gracedental.in
kehulin.com
cheappricetoyou2015.com
vamortgageloantexas.com
doitacdoanhnghiep.com
techimanage.com
elmi.co
upea.in
esncordoba.org
goal888cash.com
fullebookz.com
2winde222.com
投稿者
2017/01/23 09:37

残りを読む »