情報科学III

平成21年度 情報科学III (理系コア科目・2年生)
PHP 文法
担当 岡村耕二
月曜日 2限
http://okaweb.ec.kyushu-u.ac.jp/lectures/jk3/
本資料の一部は、堀良彰准教授、天野浩文准教授等による
1
以前の講義資料をもとにしています。
演習問題の回答例
問題1) PHP を用いて、1, 2, 3, .... , 99 と、カンマで区切られた1から99までの数字をすべて表示す
るプログラムを作成せよ。
<?php
for ($i=1;$i<100;$i++){
printf("%d",$i);
if($i!=99)
printf(", ");
}
printf("\n");
?>
2
演習問題の回答例
問題2) 上の問題1の出力について、2の倍数は赤で、3の倍数は青で、6の倍数は緑で表示するようにプログラム
を改良せよ。
<?php
for ($i=1;$i<100;$i++){
if($i%6==0)
printf("<FONT COLOR=00FF00>");
else if($i%2 ==0)
printf("<FONT COLOR=FF0000>");
else if($i%3==0)
printf("<FONT COLOR=0000FF>");
printf("%d",$i);
if($i%2==0 ||$i%3==0)
printf("</FONT>");
if($i!=99)
printf(", ");
}
printf("\n");
?>
3
前回のおさらい(1)
 PHP: Hypertext Preprocessor
 HTMLで書かれた普通のwebページの中に,PHPプログラムを
埋め込むことができる.
– PHPで書かれた部分を <?php と ?> で囲む.
– webサーバ上に置くファイルの拡張子
• HTMLのみのファイル: .htm または .html
• PHPを含むファイル: .php
4
前回のおさらい(2)
ブラウザ
①ページのリクエスト
webサーバ
②ページの取り出し
HTML
HTML
PHP
PHP処理用
モジュール
③PHP部分の処理
(結果はHTMLに埋
め込み)
④HTMLのみと
なったページが
ブラウザに返信
される
(サーバサイドでの処理となっている)
5
前回のおさらい(3)
 PHPの文法(基礎編)
– 関数の呼び出し
– 文と文の区切り
– PHPからの「脱出」
– コメント
– 変数とデータ型
– 演算子
– 制御構文
• if,else,elseif,while,for 文など
6
今日やること
 PHPの文法(基礎編)-つづき
– 配列
– 関数のいろいろ
– データを入力して計算する
 練習問題
 演習問題(宿題)
7
PHPの文法(基礎編)
(つづき)
8
配列(1)
 前回扱った変数はすべて,1つの変数が1つの値しか持たなかった.
– スカラー型
 配列(array)
– 複数の値をリストとしてまとめて格納する.
• ひとつひとつの値を要素(element)と呼ぶ.
– (PHPでは)要素の個数を後から勝手に増やすことができる.
• Cでは,格納できる要素の最大個数をあらかじめ宣言しなくてはなら
ない.
– (PHPでは)配列の要素を,番号(添え字)の代わりに名前(文字列)で区
別することもできる.
• 名前で要素を区別するような配列を連想配列と呼ぶ.
• Cにはこのような配列はない.
– (PHPでは)異なる型の要素が混在する配列も作れる.
• Cでは構造体(struct)にするしかない.
9
配列(2)
 配列を作る・修正する方法
– array() 関数を使う
• 要素を最初に全部一括登録したいときに便利
– 角括弧([ ])構文で作成・修正する
• 要素をひとつずつ登録・変更したいときに便利
10
配列(3)
 array() 関数による配列の作成・代入
array( key => value , ... )
key は、文字列または非負の整数.文字列の大文字小文字は区別される.
key の順序は任意.value にも制約はない.
例1
$fruit = array( 0 => "apple", 1 => "banana", 2 => "みかん");
$fruit
0
1
"apple"
"banana"
2
"みかん"
$fruit[0
]
11
配列(4)
 角括弧([ ])構文による作成・修正
添え字ゼロから順に,自動的に詰めていく
$fruit[] = "apple";
$fruit[] = "banana";
$fruit[] = "みかん";
この方法では,添え字
0,1,2,…という順序で
欠番無しに詰められる.
array()関数の実行結果(配列)を配列変数に代入する場合と異なり,角括弧が必要
であることに注意!
添え字(または名前)を陽に指定して
$fruit[1] = "banana";
$fruit[0] = "apple";
$fruit[2] = "みかん";
この方法では,任意の順序
で要素を格納することができ
る.また,欠番があってもよ
い.
12
配列(5)
 連想配列の例
連想配列では,任意
の順序で要素を格納
することができる.
$profile = array( "sex"
=> "男",
"age"
=> 20,
"country" => "Japan" );
$profile["sex"] = "男";
$profile["age"] = 20;
$profile["country"] = "Japan";
連想配列では,任意
の順序で要素を格
納することができる.
ただし,番号の場合
と異なり,文字列の
キーは省略不可.
13
配列(6)
 番号によるキーと名前によるキーが混在する配列も可能である
が,よほど必要でない限り,あまり使わないほうが無難であろう.
14
配列(7)
 多次元配列
– キーを複数指定することで要素を特定するような配列も作れ
る.
$two_dimensional_array =
array( key1 => array( ... ),
key2 => array( ... ),
...
);
array() 関数の呼
び出しが「入れ子」
になっている.
配列の要素に他の
$one_dimensional_array1 = array ( ... ); 配列を入れている.
$one_dimensional_array2 = array ( ... );
...
$two_dimensional_array =
array( key1 => $one_dimensional_array1 ),
key2 => $one_dimensional_array2 ),
...
);
15
関数
 ( )で囲まれたデータ(引数)を受け取り,何かの処理をして,
結果を返す.
– 「引数」は「ひきすう」と読む.
 ほとんどの場合,実行結果は,変数に直接代入できる.
– 実行結果として返される値は,「戻り値」と呼ばれる.
– 戻り値がのちのち必要になる場合は,いったん変数で受け
取っておいて,その変数を利用するとよい.
戻り値を受け取る変数 = 関数名( 引数 );
16
関数のいろいろ
 ここまでに出てきた関数
– print():実は,論理型の値(TRUE/FALSE)を返す.
– array():配列を返す.
 その他にも,たくさんの定義済み関数がある.たとえば:
– PHP処理系の情報を表示する関数
– 文字列を操作する関数
– 日付・時刻を得る関数
– 数学関数
 詳細は,PHPに関する書籍や,下記のURLを参照するとよい
http://www.php.net/manual/ja/funcref.php
17
PHP処理系の情報を表示する関数
 (論理型変数) = phpinfo( オプション );
– オプション(省略可)の例
• INFO_ALL :すべての情報(デフォルト)
• INFO_GENERAL :PHP 処理系をサーバにインストール
したときの状況
世界でもっとも単純な PHP プログラム?
<?php phpinfo(); ?>
phpinfo() 関数が
正当なHTML文書に必要
なすべてのタグを作ってく
れるので,HTMLデータの
中に埋め込まなくてもよい.
18
文字列を操作する関数の例
 (整数型変数) = strlen( 文字列 );
– 文字列の長さを返す.
 (文字列変数) = strchop( 文字列 );
– 文字列の末尾にある空白文字(スペース,タブ,改行文字そ
の他)を取り除く.
ASCIIコードのような1バイト文字コードの場合と,EUC_JP・UTF-8などのような多バイ
ト長コードの場合とで,実行結果が異なる(あるいは多バイトでは正しく実行できな
い)関数もある.
そのような関数については,レファレンスマニュアル等で,同じ関数名の頭に「mb_」
のついたものが用意されているかどうか,探して機能を比較してみるとよい.
なお,mb は「multi-byte」の略である.
19
日付・時刻を得る関数の例
 (文字列) = date( 書式文字列, タイムスタンプ );
– 書式文字列の例
(実に詳細な指定法が可能だが,ここでは例を2つだけ)
• "r" …「Wed, 2 May 2007 13:01:07 +0900」のような形式
• "F j, Y, g:i a"
…「March 10, 2001, 5:16 pm 」のような形式
– タイムスタンプ(省略したときは現在の日時)
• UNIXでは,通常,グリニッジ標準時の 1970 年 1 月 1 日
00:00:00 からの通算秒数で表現される.普通はあまり考
える必要なし.
<html>
<body>
現在の時刻は:<br>
•
<?php
print( date("r") ); ?>
</body>
</html>
20
数学関数の例
 (整数型または浮動小数点型変数)
= abs( 整数または実数 );
– 絶対値を求める.
 (浮動小数点型変数) = sqrt( 浮動小数点型データ );
– 平方根を求める.
21
値を入力して、足し算を行う
 main.htm
<form method="POST" ACTION=“plus.php"><p>
<input type="text" name="a" size="4">
<input type="text" name="b" size="4">
<input type="submit" value="Plus">
<input type="reset" value="clear">
</form>
 plus.php
<?php
$a=$_POST["a"];
$b=$_POST["b"];
printf("%d + %d = %d",$a,$b,$a+$b);
?>
22
入力フィールド
•
•
•
•
•
•
•
•
•
•
•
テキスト入力フィールド (<input type=text)
パスワード入力フィールド (<input type=password)
チェックボックス (<input type=checkbox)
ラジオボタン (<input type=radio)
提出ボタン (<input type=submit)
リセットボタン (<input type=reset)
イメージ上の座標入力 (<input type=image)
ファイル名入力フィールド (<input type=file)
隠しフィールド (<input type=hidden)
選択メニュー (<select ... )
テキストエリア (<textarea ... )
23
入力フィールド(例)
24
練習問題
 100個の乱数を発生させ、並び換えるプログラムを作成しなさい。
 発生させる乱数の
– 最小値
– 最大値
– 個数
– を、入力し、乱数を発生させ、それを並び換えるプログラム
を作成しなさい。
25
演習問題
 a, b, c を入力して、2次方程式を解くプログラムを作成せよ。
– aX^2 + bX = C
 名前、数字を5組入力し、A)数字をソートして、B)名前をソートして、表示す
るプログラムを作成せよ。
– 入力画面および入力例
Hakozaki
12
Ropponmatsu
9
Maidashi
22
Ito
4
Ohashi
29
26
うまく表示できないときのチェックリスト
 HTMLの開始タグ・終了タグはきちんと対応が取れているか?
– 例:<head> ~ </head>
 PHPの開始タグ・終了タグはきちんと対応が取れているか?
– <?php ~ ?>
 ( ~ ),{ ~ }," ~ ",などの対応は取れているか?
 あるべきところにセミコロンがあるか?
 連想配列に値をセットするとき/値を読むとき,キーの名前を
打ち間違えていないか?
– 例: $message["Wed"] と $message["Wen"];
27