PHP で遊ぼう(6) – if と 変数と
毎回蛇足の多い、~遊ぼうシリーズ。 おじさんになると、こうなんというか昔話を若い者にしたくなるもんですが、コンピュータの世界ではぼくも中年?。 まぁまぁ、古き良き昔話にもお付き合いください。 コンピュータ同世代の方は、なつかし~と思って読んでいただけたら幸いです。 🙂
プログラム言語というのは物事の処理の手順をきわめて紛れなく記述できる、人間のための言語です。 一般的にはコンピュータに指示させるための言語として位置づけられていますが、究極的には人間のためにもなるもんです。なんて、まぁいまのプログラム言語は純粋な手順以外にも余計なことを書かなければいけないので、これは極論です。ぼくはそうなることを期待しているのですが…。
では前置きはともかく。
たとえば、日常生活で数字を順番に並べ替えるなんてことはトランプとか麻雀しているとよくやることですが、みなさん実際にやるとするとどーやっていますか?
8, 4, 2, 6, 3, 1, 5, 7
このように並んだカードを小さい順番に並べ替える方法。 意外と無意識でやっちゃいますが、ぼくは一番小さい数字を探して左にもっていき、いま一番左のカードといれかえる、その後の左においたものは最小数字の検索対象から外す、という方法を基本的にはとるようです。
コンピュータの世界では並べ替えをソートといい、上のような方法を逐次選択方といいます。 たしか。。
じゃーこの手順を箇条書きで日本語で書いてみましょう。
- 対象のカードから一番小さいものを探す。 初回の対象は全カード
- 見つけたらそのカードを一番左にもってきて、現在の対象の一番左のカードと入れ替える。
- 1. に戻る
プログラミングというのは、こういった手順をプログラム言語に直すことです。別にコンピュータにやらせるからといって特殊なことはありません。 ほとんどの場合、一般的な常識(人間の思考の流れ)をそのまま記述するだけです。
しかしながら、コンピュータは日本語では分からないのです。 なぜならば言葉の定義に紛れがあるから。「対象のカード」「小さいもの」全てをうそなく教えてあげる必要があります。
そのために使われるのが、変数とか制御構文とかそういった言語に備わった機能になります。
で、事前にひとつ謝ることが。 WordPress のプラグインを次の回で取り上げようと思っていたのですが、もう一回先に回させてください。 お気づきの通り、このペースで書いているとものすごい一回が長くなりそうなので、、ご勘弁を。。
さてさて、上でやったようなカードの並べ替え、今回はこれを変数と if でやってみたいと思います。 まずは話を簡単にするために、カードは2枚であるとしましょう。
8, 4
こういったカードが机に並べてあることを想像してください。 そして、これが数字の小さい順番に左から並べば完成です。
プログラム言語の世界では、情報を変数という入れ物にいれて管理します。変数には分かりやすいような”名前”をつけることができ、これを変数名といいます。
PHP ではこの変数名は頭に”$” をつける決まりとなっていて、たとえば2枚のカードの左側においてあるものを left 、右側を rigth とすると、上のカードの並びは以下のように表すことができます。
- $left = 8;
- $right = 4;
左には8が、右には 4 が置いてあります。
変数名に続けて = を書くことで右辺の値を “代入” することができます。 また、右辺には数字だけでなく様々なものが書けるのですが、ここに変数名を書くこともできます。
たとえば、
- $hoge = 10;
- $hogehoge = $hoge;
こうすると、$hogehoge は $hoge の値が代入されて 10 になります。前回までの解説の通り、プログラムは上から順に実行されます。
また、右辺で四則演算等もできますので、
- $hoge = 10;
- $hogehoge = $hoge + 1;
とすると、$hogehoge は 11 になります。
昔高校生のとき、プログラム言語を知らない友達がぼくの印刷したソースをながめていて、「この式はおかしい」といったことがありました。 結構目から鱗だったのですが以下のようなコードでした。
- $hoge = 10;
- $hoge = $hoge + 1;
プログラム言語に慣れちゃっているとまったく違和感がないのですが、数学的な”等価”式としてみると確かにおかしいです。 $hoge = $hoge + 1 ですからこの式は解けません。 🙂
多くのプログラム言語において、 = は代入のみを表します。 なのでこのように自分自身を右辺に書くことができます。 この場合、自分自身 $hoge の 10 に対して 1 を足した 11 が $hoge にはいります。 右辺から順に評価されるわけです。
変数には他にも文字などいろいろなものが入るのですが、今回はここまで。 まずは、コンピュータ言語で何かを処理するには、必ずデータを変数に格納する必要があるという感覚を身につけます。 逆に言えば、処理できる形にデータを格納できてしまえば半分はプログラムが完成したと言っても過言ではないでしょう。
今回は変数に対してカードの”位置”を割り当てています。左($left)が8のカードで、右($right)が4のカードです。
- $left = 8;
- $right = 4;
変数と言うだけあって、変わる数。 本来ならば、左の数と右の数は画面からの入力によってその値を変えたりします。でも、まだその方法までたどり着いていませんので、ここを変えたいときは手作業でソースを修正することにしましょう。 🙂
やりたいことは、左と右を比べて小さい順に並べ替えることです。
ここで登場するのが、if という制御構文です。 これは比較演算を行いその結果に伴って”処理の流れ”を変えることができます。 書き方は以下のようになります。
- if(比較演算) {
- やりたいこと1;
- やりたいこと2;
- ...;
- }
比較演算というのは、今回まさにやりたい値の大小判定やイコールの判定などが書けます。そして、その条件に”合致”していた場合は、if の後の { 中括弧から } までの間を実行します。 そうでなたっか場合はその中は実行されず、 } の下におちます。 いままでは上から下に順に実行されていましたが、その内容をスキップできるようなイメージです。
じゃー、今回の2枚のカードの左からの小さい順番での並べかえは以下のようにできそうです。
- $left = 8;
- $right = 4;
- if($left > $right) {
- $left と $right の内容をいれかえる;
- }
もし(if)、左のカードのほうが大きかったら右と入れ替える、デス。
比較演算には数学と同じように、<、>、 <=、 >=、などが使えます。
一点注意するのは今回は使いませんが、イコールの判定です。 先ほど上で出てきたように、PHP において = は代入です。 等価の意味ではありません。 等価を表すには == とイコールを重ねて書きます。 これはよく間違うところですので、十分気をつけてください。 とりあえず、最初は if の中は == って覚えておきましょう。
実はたとえば他言語、Visual Basic などでは = は等価として使えたりします。 ちゃんぽんで言語やっている人も要注意です。(←恥ずかしいことに先日間違った
さあ、あとは「$left と $right の内容をいれかえる;」という処理を PHP で書けば完成です。実はぼくが書くまでもなく、ここまでの知識で変数の入れ替えの処理は書くことができます。どうするでしょう? なんて。:-)
難しいことではないです、一般的に考えるだけで十分です。 二つのグラスの異なるジュースの入れ替え、みたいなもんです。 ですね、もーいっこグラス(変数)を使えば良いわけです。 え、空中で入れ替えるって? 大道芸はコンピュータには無理です。 😛
$left と $right 変数の入れ替えの処理だけ書いてみましょう。
- $left = 8;
- $right = 4;
- //入れ替え
- $temp = $left;
- $left = $right;
- $right = $temp;
$temp という変数を新設して、$left を保持させておいて $right で $left を上書きします。 保持しておいた $temp($left) の値を $right にいれればいれかえ完成です。
ジュースをグラスから移すのと違って、= で代入しても元の値はそのままだということに注意してください。変数間のやりとりはあくまで代入、コピーとなります。 移動ではありません。
じゃー先ほどの if と組み合わせてみましょう。
- $left = 8;
- $right = 4;
- if($left > $right) {
- //左のほうが数字が大きかったら入れ替え
- $temp = $left;
- $left = $right;
- $right = $temp;
- }
完成! って、これだけでは動かしても画面出ませんね。 じゃー最後に仕上げに 結果を HTML で出力させてみましょう。
- $left = 8;
- $right = 4;
- if($left > $right) {
- //左のほうが数字が大きかったら入れ替え
- $temp = $left;
- $left = $right;
- $right = $temp;
- }
- <html>
- <body>
- <p>左がecho $left;で、右がecho $right; です。</p>
- </body>
- </html>
前回出てきた、画面に表示を行う echo ですが、変数の表示も行うことができます。上で処理された $left、$right の値を下の HTML で表示してみました。
左が4で、右が8 です。
うまく入れ替わってくれたようです。 $left、$right の数字を変更して遊んでみましょう。マイナスの数字とかでもうまくいくハズです。
さてさて、以上で今企画している WordPress プラグインを作る知識はお伝えできたはずなのですが、実は if や変数には多くの機能があります。
たとえば、if の条件の中に and や or の複合条件を書けたり、if 後に else や else if といった構文を書くと条件以外の時の処理を書けたり、if の中括弧 { の中にさらに if を入れるなどの技もあります。
if の構文で言えば以下のようになります。
- if(条件1) {
- 条件1にあったときやること1;
- if(条件2) {
- 条件2にあったときやること1;
- 条件2にあったときやること2;
- } else if(条件3) {
- 条件2じゃなく条件3にあったときやること;
- }
- 条件1にあったときやること2;
- } else {
- 条件1じゃなかったときやること;
- }
- 必ずやること;
よーくみれば、必ず分かると思います。
では今回の例題カードならべかえの3枚版を。 $center が真ん中です。 😛
- $left = 8;
- $center = 2;
- $right = 4;
- 並べ替えの処理;
- <html>
- <body>
- <p>左がecho $left;で、真ん中がecho $center;で、右がecho $right; です。</p>
- </body>
- </html>
ぜひぜひ挑戦してみてください。これがうまくできたときの爽快感を味わったらもう後には戻れません。プログラミングの世界にようこそ。 :-P できたらトラックバックくれたりすると嬉しかったり。 変態コードもお待ちしております(笑)
さぁぱっとみ3枚でも大変そうなのに、これが4枚になったらと思うとゾっとしませんか? 10枚になったら? 変数名考えるだけでもいやになります(笑)
実は変数にはこういった同種類のデータを同じように扱える、配列という機能があります。 これとループと呼ばれる技と組み合わせると、データがいくつあっても同様に処理できるようになります。
でも便利なものは後から。それでこそ使い道が身につくというものです。最近はソートすら関数一発だからねぇ。。
とおじさんの戯言が始まったところで、また次回。
From: 雑念ベース - 2007/3/6 Tuesday (Trackback)
PHP による並べ替え…
ひろまささんの連載記事『PHP で遊ぼう』の第6回で3つの数字の並べ替えプログラムを募集とのことでしたのでやってみました。
… (more…)
[続きを読む]
From: PHPのお勉強 - 2007/3/7 Wednesday (Trackback)
ifを使って3枚並び替え…
先日、PHPとWordPressを組み合わせてやってくださいとお願いしたnaokiです。で、PHPの問題を早速やってみました・・ (more…)
[続きを読む]