ウェブ学のすすめ

Study of Web Design & Programing

PHPで九九表を作る方法



PHPで九九表を作ってみました。以前JavaScript版は作りましたがPHPでの作成はまだだったので挑戦。といっても変数の指定ぐらいしか違いがありませんでしたが...。

今回はテーブルのデザインを変更、ホバー時に該当のセルの色が変わる機能を追加実装してみました。

↓以前JavaScriptで作った九九表はこちら
JavaScriptで作る九九表 - ウェブ学のすすめ

練習問題

九九表をPHPで作りなさい

for文のネスト
tableをfor文で生成する場合は、「行」を基準に設定する

引用元:練習課題(1) - 求職者支援訓練 Webデザインの勉強 | Web風姿花伝

プレビュー

f:id:vinton:20140202195745p:plain


別ウィンドウで見る:PHPで作る九九表

ソースコード

PHP
<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width">
<title>PHPで作る九九表</title>
<link href="style.css" rel="stylesheet">
<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.7.2/jquery.min.js"></script>
</head>
<body>
<h1>九九表</h1>
<table>
<?php
for($row=0;$row<=9;$row++){
    echo "<tr>";
    for($col=0; $col<=9; $col++){
	if( $col==0 && $row==0){
	    echo "<th>&nbsp;</th>"; //一番左上のセル生成
	}
	else if($col==0 && $row!==0){ //行見出し生成(一番左上のセルを除く)
	    echo "<th>".$row."</th>";
	}
	else if($row==0){
	    echo "<th>".$col."</th>"; //列見出し生成(一番左上のセルを除く)
	}
	else{
	    echo "<td>".$col*$row."</td>"; //その他のセル(行×列)
	}
    }
    echo "</tr>";
}
?>
</table>
<script>
$(function(){
  var overcells = $("table td"),
      hoverClass = "hover",
      current_r,
      current_c;

  overcells.hover(
    function(){
      var $this = $(this);
      (current_r = $this.parent().children("table td")).addClass(hoverClass);
      (current_c = overcells.filter(":nth-child("+ (current_r.index($this)+2) +")")).addClass(hoverClass);
    },

    function(){
      current_r.removeClass(hoverClass);
      current_c.removeClass(hoverClass);

    }
  );
});
</script>
</body>
</html>
CSS
@charset "utf-8";
table {
  width: auto;
  border-spacing: 0;
  font-size:14px;
}
table th {
  color: #fff;
  padding: 8px 15px;
  background: #258;
  background:-moz-linear-gradient(rgba(34,85,136,0.7), rgba(34,85,136,0.9) 50%);
  background:-webkit-gradient(linear, 100% 0%, 100% 50%, from(rgba(34,85,136,0.7)), to(rgba(34,85,136,0.9)));
  font-weight: bold;
  border-left:1px solid #258;
  line-height: 120%;
  text-align: center;
  text-shadow:0 -1px 0 rgba(34,85,136,0.9);
  box-shadow: 0px 1px 1px rgba(255,255,255,0.3) inset;
}
table th:last-child {
  border-right:1px solid #258;
  box-shadow: 2px 2px 1px rgba(0,0,0,0.1),0px 1px 1px rgba(255,255,255,0.3) inset;
}
table tr td {
  padding: 8px 15px;
  border-bottom: 1px solid #84b2e0;
  border-left: 1px solid #84b2e0;
  text-align: center;
}
table tr td:last-child {
  border-right: 1px solid #84b2e0;
  box-shadow: 2px 2px 1px rgba(0,0,0,0.1);
}
table tr {
  background: #fff;
}
table tr:nth-child(2n+1) {
  background: #f1f6fc;
}
table tr:last-child td {
  box-shadow: 2px 2px 1px rgba(0,0,0,0.1);
}
table td.hover {
	background:#bbd4ee;
	cursor:pointer;
}
table td.hover:hover {
	background:#84f4f4;
	cursor:pointer;
}

解説

一番外側のfor文(for文1)

10回処理を繰り返します。

<?php
for($col=0; $col<=9; $col++){
<tr>を出力
外側から2番目のfor文(for文2)を処理
</tr>を出力
}
?>


出力結果

<tr>for文2の処理</tr>
<tr>for文2の処理</tr>
<tr>for文2の処理</tr>
<tr>for文2の処理</tr>
<tr>for文2の処理</tr>
<tr>for文2の処理</tr>
<tr>for文2の処理</tr>
<tr>for文2の処理</tr>
<tr>for文2の処理</tr>
<tr>for文2の処理</tr>
外側から2番目のfor文(for文2)

10回処理を繰り返します。

<?php
for($col=0; $col<=9; $col++){
	if( $col==0 && $row==0){
	    echo "<th>&nbsp;</th>"; //一番左上のセル生成
	}
	else if($col==0 && $row!==0){ //行見出し生成(一番左上のセルを除く)
	    echo "<th>".$row."</th>";
	}
	else if($row==0){
	    echo "<th>".$col."</th>"; //列見出し生成(一番左上のセルを除く)
	}
	else{
	    echo "<td>".$col*$row."</td>"; //その他のセル(行×列)
	}
    }
?>


出力結果

//$row=0の場合
<th></th><th>1</th><th>2</th>・・・<th>8</th><th>9</th>

//$row=1の場合
<th>1</th><td>1</td><td>2</td>・・・<td>8</td><td>9</td>

//$row=2の場合
<th>2</th><td>2</td><td>4</td>・・・<td>16</td><td>18</td>
・
・
・
//$row=9の場合
<th>9</th><td>9</td><td>18</td>・・・<td>72</td><td>81</td>