HOME学科ブログ › 連載講座:『PHP入門』第6回 ~アルゴリズム+データ構造=プログラム~

学科ブログ

連載講座:『PHP入門』第6回 ~アルゴリズム+データ構造=プログラム~【CG・Webクリエイター科

2011年12月01日

CG・Webクリエイター科の水谷です。

本日のテーマは

『PHP入門』 第6回 ~アルゴリズム+データ構造=プログラム~

 

Step1.今回の準備

今回のサブタイトルは、実は書籍の名前です。
『アルゴリズム+データ構造=プログラム』 (1975年) ニクラウス・ヴィルト(Niklaus Wirth)著
スイス人なので、ドイツ語読みになるのだと思うのですが、"ウィース" さんではなく "ヴィルト" さんです。
今から36年も前に出版された本なので、コンピュータ界では 『源氏物語』級 かもしれません。
古いので、あえて「読みましょう。」とは言いませんが・・・、いつかは読んでみますか?

今回は、下記の2つの 『データ構造』 を使ってみます。
(1) 配列
(2) リスト構造

『データ構造』 というのは、
プログラムで処理するデータを、どのようにコンピューターのメモリーに格納するのか?
この方法論(やり方)だと理解して下さい。
一方、『アルゴリズム』 というのは、問題を解く方法論(やり方)だと理解して下さい。
この用語の説明は、一旦終了。でないと、本が一冊書けてしまいます。

『配列』 を説明しておきます。
前回、連載講座:『PHP入門』第5回 ~画像を表示~ Step5.ファイル入力とテキスト表示の(1) で、変数 を説明しました。
書き方と使い方しか説明できていませんでしたが、1つの変数が、値を1つだけ格納できます。
プログラムによっては、これでは手間がかかることもあります。
例えば、同じ処理パターンで、次々とデータを加工いて行く場合などです。
『配列』 というのは、変数の名前は1つです。それプラス、通し番号を用意しておいて、沢山のデータを通し番号で区別します。
この通し番号のことを、『添え字』 と言います。
高校で、1クラスの生徒を機械的に効率良く管理するために、出席番号があるのと同じです。
コンピューター内部のデータには、人格も感情も無いので、機械的に通し番号で、効率良く処理してしまいましょう。
そして、配列の変数名と、添え字によって、特定の1つだけを指定できますが、その1つ1つを 『要素』 と言います。
配列の変数名をマンション名として、添え字を部屋番号とすると、要素とは、1軒1軒の部屋に相当します。
つまり、マンション名と、部屋番号を特定すると、1軒の部屋が特定されます。(こんな感じ。)

 

Step2.ランダムに画像1枚を選んで表示

HTML と、PHPプログラムの部分を掲載しておきます。
   (説明のために色をつけています。入力には無関係ですので、色は無視して下さい。)
   コピー&ペーストして、ご利用下さい。

【 List 01 】
------------------------------ ここから ------------------------------
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">
<html lang="ja">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=shift_jis">
<title>PHP sample</title>
</head>
<body>

乱数を使って、画像ファイルを1つだけ表示。<br>
<!-- ここが PHP のサンプル -->
<?php
    srand();
    $fname = array();
    $title = array();
    $alt   = array();

    if( $fp = fopen( 'ImgInfo.txt', 'r' ) )
    {
        $j = 0;
        while( $fname[$j] = fgets( $fp ) )
        {
            $title[$j] = fgets( $fp );
            $alt[$j]   = fgets( $fp );
            $j++;
        }
        fclose( $fp );
        $cnt = $j;
        $j = rand( 0, $cnt-1 );
        print("<p><img src=$fname[$j] title=$title[$j] alt=$alt[$j] width='400' height='267'>");
        print("<br>写真:(".($j+1).") ");
        print($alt[$j]);
        print("<br></p>");
    }
?>
</body>
</html>

------------------------------ ここまで ------------------------------
【 解説(配列) 】
(1) 『配列』 の確保。
$fname = array(); 以下3行で、$fname、$title、$alt の3つの配列を確保しました。
他の多くのプログラミング言語(例えば、C言語など)では、『要素』 の個数を確定するような記述が必要ですが、
PHP では、そこのあたりは曖昧です。(C言語を知っていると、「ええんか!」って思う。)
変数名 = array(); の記述で、この変数が 『配列』 であると

(2) 『配列』 の利用(その1)。
while( $fname[$j] = fgets( $fp ) )
前回、連載講座:『PHP入門』第5回 ~画像を表示~ Step5.ファイル入力とテキスト表示の(3) では、
while( $fname = fgets($fp) )
の解説をしています。fgets() で、ファイルから1行読み込んで、変数 $fname に代入します。
今回も同様に、fgets() で、ファイルから1行読み込んで、配列 $fname の $j 番目の要素に代入します。
$j が 『添え字』 です。

(3) 『添え字』 のカウントアップ
$j = 0; と、$j
前回、連載講座:『PHP入門』第5回 ~画像を表示~ Step6.ファイル入力と画像表示の(1) (2) で解説しました。
$j が、0 から始まり、1件目の画像データを読み込んで 1 になり、
2件目の画像データを読み込んで 2 になり、
3件目の画像データを読み込んで 3 になり、
4件目の画像データを読み込もうとして、読めずに繰り返し処理を終了。
$j の値は、3 になっています。
今回もほぼ同様です。
$j が、0 から始まり、1件目の画像データを読み込んで、0 番目の要素に代入して、$j が 1 になり、
2件目の画像データを読み込んで、1 番目の要素に代入して、$j が 2 になり、
3件目の画像データを読み込んで、2 番目の要素に代入して、$j が 3 になり、
4件目の画像データを読み込もうとして、読めずに繰り返し処理を終了。
$j の値は、3 になっています。

(4) 画像を1枚表示
print("<p><img src=$fname[$j] title=$title[$j] alt=$alt[$j] width='400' height='267'>");
$j の値はともかく、この print() 文は、while の繰り返し処理の外なので、実行は1回だけです。

【 解説(ランダム) 】
(1) 『乱数』
$j = rand(0, $cnt-1);
上記 (4) で、
> $j の値はともかく、・・・
と書きましたが、ここで、$j に何らかの値が代入されます。
rand() は、『乱数』を返す関数です。
『乱数』 とは、規則性の無い数の並びです。
例えば、2 4 6 8 10 12 ・・・ と、並んでいると、次の数は 14 だとわかります。
1 1 2 3 5 8 13 21 ・・・ だったら、次の数は 34 です。
(これは『フィボナッチ数列』と言い、最初の 1 と 1 を別として、それ以降の数は、前の2つの数の合計です。
なので、13 + 21 = 34 となり、21 の次が、34 だとわかります。)
1つ目の数の並びよりも、2つ目の数の並びの方が、わかりにくい数の並びになっています。
これを、もっともっともっともっと・・・分かりにくい数の並びを造ると、人間には、瞬時に次の数がわからなくなります。
これが 『乱数』 です。
本当は、「もっともっともっともっと・・・分かりにくい数の並び」、にも規則がありますので、乱数モドキという表現が正しいですね。
なので、正確に言うと、『疑似乱数』 と言います。
つまり、本当は 『疑似乱数』 ですが、人間には瞬時に次の数がわからないので、『乱数』 と見なします。
コンピューターでは、『疑似乱数』 しかありませんので、コンピューターゲームでも同じ事情です。

(2) $j の値
$j = rand(0, $cnt-1);
rand() 関数のパラメーターが、1つ目が 0 で、2つ目が $cnt-1 です。
$cnt には、3 が代入されています。(∵1つ前の行に、$cnt = $j; があって、この $j の値が 3 です。これを $cnt に代入しました。)
なので、$cnt-1 は( 3 - 1 で ) 2 になります。

配列と乱数うを使って、画像表示の説明図(河原電子ビジネス専門学校のCG・Webクリエイター科)
図1.配列と乱数を使って、1枚の画像を表示している仕組み

(3) 『乱数』の初期化
srand();
srand() 関数を使って、乱数ジェネレータを初期化します。
一般に、rand() 関数を使用する前に1回だけ、srand() 関数を呼び出します。
C言語など、多くのプログラミング言語でも同様に、rand() 関数を使用する前に1回だけ呼び出します。
そして、本来はパラメータとして、シード値という、上記 『疑似乱数』 を生成するための値が必要です。
通常は、タイマー関数等で、常に変化する値をシード値として srand() 関数に渡さなくてはなりませんでした。
しかし、PHP では、Ver4.2.0 以降、このパラメータが不要になりました。
(他の、C言語など、多くのプログラミング言語では、これが必要です。)

Step2.はここまで。下記、図2のように表示できたら成功です。

step02_1201.png

図2.画像をランダムに1枚表示したブラウザ表示画面

以上が配列を使った場合です。

リスト構造を書けませんでした。残念!来週書きます。

< 連載講座:『PHP入門』 ・・・ 前へ | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 次へ >

このページの先頭へ