Pages

Subscribe:

2011-12-30

PHPの練習~その2(都道府県と県庁所在地)

復習を兼ねた練習問題の第2弾です。
今回は配列、foreach文、関数を使ってプログラムを作りたいと思います。
実際に授業でやったときにすごく苦労した記憶があるので、
自分の復習も兼ねてまとめてみます。

やろうとしていることは以下の通りです。
  • 都道府県と県庁所在地を入れた配列を作る
  • foreach文で繰り返し、変数に指定した都道府県の県庁所在地のみ表示する
  • 県庁所在地を表示させたい都道府県を配列にし、複数表示する
  • そのプログラムを関数化する


都道府県と県庁所在地を入れた配列を作る

これは連想配列で定義します。
都道府県をkey、県庁所在地をvalueとし、ただひたすら入力していきます。
<?php
$todofuken = array('北海道'=>'札幌市','青森県'=>'青森市','岩手県'=>'盛岡市','宮城県'=>'仙台市','秋田県'=>'秋田市','山形県'=>'山形市','福島県'=>'福島市','茨城県'=>'水戸市','栃木県'=>'宇都宮市','群馬県'=>'前橋市','埼玉県'=>'さいたま市','千葉県'=>'千葉市','東京都'=>'新宿区','神奈川県'=>'横浜市','新潟県'=>'新潟市','富山県'=>'富山市','石川県'=>'金沢市','福井県'=>'福井市','山梨県'=>'甲府市','長野県'=>'長野市','岐阜県'=>'岐阜市','静岡県'=>'静岡市','愛知県'=>'名古屋市','三重県'=>'津市','滋賀県'=>'大津市','京都府'=>'京都市','大阪府'=>'大阪市','兵庫県'=>'神戸市','奈良県'=>'奈良市','和歌山県'=>'和歌山市','鳥取県'=>'鳥取市','島根県'=>'松江市','岡山県'=>'岡山市','広島県'=>'広島市','山口県'=>'山口市','徳島県'=>'徳島市','香川県'=>'高松市','愛媛県'=>'松山市','高知県'=>'高知市','福岡県'=>'福岡市','佐賀県'=>'佐賀市','長崎県'=>'長崎市','熊本県'=>'熊本市','大分県'=>'大分市','宮崎県'=>'宮崎市','鹿児島県'=>'鹿児島市','沖縄県'=>'那覇市');
?>

foreach文で繰り返し、変数に指定した都道府県の県庁所在地のみ表示する

先ほど定義した配列をforeach文で分解します。
foreach($todofuken as $ken => $kencho){
    echo $ken.'の県庁所在地は'.$kencho.'です。<br>';
}
表示させてみると47個分の文章ができます。長いので途中まで。

今回はその中のうち、変数に定義した都道府県の県庁所在地だけを
表示させるようにしたいので、まずはその変数を定義します。
都道府県を選ぶので「$ken_s」と名前を付け、
とりあえず神奈川県を入れておきます。

変数と一致している時だけ表示をしたいので、if文を使用します。
foreach文で分解したkey($ken)と、 先に定義した変数の値が一致するとき
value($kencho)を表示するのでforeach文の中にif文を書きます。
$ken_s = '神奈川県';

foreach($todofuken as $ken => $kencho){
    if($ken == $ken_s){
        echo $ken.'の県庁所在地は'.$kencho.'です。<br>';
    }
}
ブラウザで表示させてみると以下のようになります。


47都道府県のうち神奈川県で一致する文のみが表示されました。
ここでポイントになるのは、あくまでもforeach文は全ての処理を行っている
ということです。
その中でif文で指定した条件が一致するものだけ表示を行っているのです。


県庁所在地を表示させたい県を配列にし、複数表示する

先ほど変数で定義していた部分を配列にして、一度に複数の県庁所在地を
表示させます。
適当に選んだ都道府県をここでは5つ配列に定義します。
配列名の名前を「$kens_s」とします。
$kens_s = array('神奈川県','北海道','大分県','愛媛県','滋賀県'); 
その配列をforeach文で分解します。普通の配列なので「as」のあとはvalueのみ
記述します。
このforeach文で先ほどのforeach文を包むような形になります。
foreach($kens_s as $ken_s){
    foreach($todofuken as $ken => $kencho){
        if($ken == $ken_s){
            echo $ken.'の県庁所在地は'.$kencho.'です。<br>';
        }
    }
}
この例では「$kens_s」を分解するforeach文のvalue値を「$ken_s」にしたので
変更はありませんが、if文の条件は最初のforeach文のvalue値と
あとのforeach文のkey値が一致するときという意味だということを
頭に入れておきます。
ブラウザで確認してみます。
5つの県が繰り返される間に、47都道府県が繰り返され、
お互いの都道府県が一致するものだけが表示されます。
5つの都道府県の県庁所在地を表示させることができました!

foreach文を入れ子にするあたりがややこしいですが、考え方は九九の表を
作った時と同じです。

そのプログラムを関数化する

最後にこのプログラムを関数化してみます。
ここでネックになるのは、引数が配列になるということと、
戻り値も配列になるといういことです。

県庁所在地をgetするための関数という意味を込め、
関数名は「getKencho()」にします。
引数には関数の中で必要になる都道府県を定義した配列を指定し、
もとのプログラム側から引き渡してもらえるようにします。
都道府県が複数入るので名前は「$kens」にします。
関数を定義する部分は以下の通りです。
function getKencho($kens){
}
見た目は変数と変わらないので分かりにくいですが、「$kens」は配列です。

先ほど作ったプログラムを関数の中に移動させます。
また、関数では一致したものを取り出す処理を行い、
最後のreturn(戻り値)で表示させたい値を元のプログラムに返すようにしたいので
戻り値には5つ分の値が入っていなければなりません。
つまり、配列になります。

先ほどまで表示の処理を書いていた部分は、
都道府県が一致するものを連想配列に定義する処理になります。
arrayを利用しない配列の定義方法を使い、
「配列名[' ']」という形で
if文の条件が一致するものの県庁所在地のみを配列にいれていき、
最終的にそれが戻り値となります。

関数部分のコードは以下のようになります。
function getKencho($kens){
    $todofuken = array('北海道'=>'札幌市','青森県'=>'青森市','岩手県'=>'盛岡市','宮城県'=>'仙台市','秋田県'=>'秋田市','山形県'=>'山形市','福島県'=>'福島市','茨城県'=>'水戸市','栃木県'=>'宇都宮市','群馬県'=>'前橋市','埼玉県'=>'さいたま市','千葉県'=>'千葉市','東京都'=>'新宿区','神奈川県'=>'横浜市','新潟県'=>'新潟市','富山県'=>'富山市','石川県'=>'金沢市','福井県'=>'福井市','山梨県'=>'甲府市','長野県'=>'長野市','岐阜県'=>'岐阜市','静岡県'=>'静岡市','愛知県'=>'名古屋市','三重県'=>'津市','滋賀県'=>'大津市','京都府'=>'京都市','大阪府'=>'大阪市','兵庫県'=>'神戸市','奈良県'=>'奈良市','和歌山県'=>'和歌山市','鳥取県'=>'鳥取市','島根県'=>'松江市','岡山県'=>'岡山市','広島県'=>'広島市','山口県'=>'山口市','徳島県'=>'徳島市','香川県'=>'高松市','愛媛県'=>'松山市','高知県'=>'高知市','福岡県'=>'福岡市','佐賀県'=>'佐賀市','長崎県'=>'長崎市','熊本県'=>'熊本市','大分県'=>'大分市','宮崎県'=>'宮崎市','鹿児島県'=>'鹿児島市','沖縄県'=>'那覇市');
    foreach($kens as $kens_one){
        foreach($todofuken as $ken => $kencho){
            if($ken == $kens_one){
                $kenchos[$ken] = $kencho;
            }
        }
    }
    return $kenchos;
}
意味するところが似ているので、似たような変数名が多くややこしいのですが
foreach文がそれぞれどの配列と対応しているかを考えると
分かりやすいのではないかと思います。

戻り値も配列になっているため、受け取った側で分解する必要があります。
「○○(都道府県)の県庁所在地は××(県庁所在地)です」
と表示させたいので、連想配列を分解する要領でforeach文を書きます。
関数以外の部分のコードは以下の通りです。
$kens_s = array('東京都','福岡県','沖縄県','兵庫県','宮城県');

$kenchos_result = getKencho($kens_s);

foreach($kenchos_result as $ken => $kencho){
    echo $ken.'の県庁所在地は'.$kencho.'です。<br>';
}
表示は以下のようになります。
ちなみに、配列とforeach文の組み合わせなので、
「$kens_s」の中身が増減してもプログラムは問題なく動きます。
foreach文の便利なところです。


都道府県と県庁所在地のプログラムを作ることができました!
最初は何が何だか理解に苦しんだのですが、
今は読んで意味は分かるくらいにはなったので自分も成長しているみたいです。
また何もないところから書いてみろと言われるとちょっと自信ないですけど…

これは入力フォームと組み合わせて使うと
いい感じになるのではないかと思います。
今後データの受け渡しについてまとめ終わったときに改めて、
都道府県を入力すると県庁所在地が表示されるという
少し実用っぽいもので練習できたらと思います。

0 件のコメント:

コメントを投稿