#4 PHPで条件によって処理を変える(条件分岐)

条件を作っていくつかの答えに分けるifイフ

if=もしも。
例えば、ある枠線を「もし、男性だったら青い線、女性だったら赤い線にする」
といったように、なにかの条件によって変わるいくつかの答えを用意し 答えを分岐させることで結果を変えていくことを目的とします。

プログラムのif文は条件を決めて、その条件に対して真偽しんぎ つまり(trueトゥルー, falseフォールス)を判別し、 その真偽によって、答えを何通りかに分けるという式になります。 if文がピンとこない人はexcel講座を履修してみましょう。 excelと違ってelseifなどの複数条件式もあるので便利です。
変数への初期設定

$ageA = 50;
$ageB = 50;
if文の場合

if ($ageA >= 20 || $ageA == 100) {
  echo "お酒はOK!";
}
if else文の場合

if ($ageA > 20) {
  $message = "大人ですね";
} else {
  $message = "子どもですね";
}
echo $message;
if elseif else文の場合

if ($ageB < 20) {
  $message = "こどもだ";
} elseif ($ageB < 59) {
  $message = "おとなだ!";
} else {
  $message = "おじいちゃんかな?";
}
echo $message;
三項演算子の場合(if文の簡単な書き方)

$message = ($ageB > 20) ? "大人ってことで" : "子どもってことで";
  echo $message;
?>

条件式の書き方

単純な条件式の場合

if( 条件 ) {
 真の時に実行される処理;
}
条件式が分岐する場合

if( 条件 ) {
 真の時に実行される処理;
} else {
 偽の時に実行される処理;
}
三項演算子

( 条件 ) ? 真の時に実行される処理 : 偽のの時に実行される処理;
条件が複数分岐の場合

if( 条件1 ){
 条件1が真であれば実行;
} elseif( 条件2 ) {  /* elseif(条件3)、elseif(条件4)、と増やせます */
 条件1には該当しなかったが、条件2が真であれば実行;
} else {
 条件1も2も満たない、偽であれば実行;
}

#5 PHPで繰り返し処理を行う(ループ処理)

ループ処理とは

ループ処理とは、ある条件下において「繰り返し」処理を行う構文のことを指します。
例えば、ある数5(初期値)というものがあり、 その数字が10(条件)になるまで1ずつ足していきなさい(処理)。ということです。 どんな時に使うかといえば、例えばデータベースの中に何行あるかわからないが、 1行目から初めて行が終わるまで値(配列)を取ってきてechoして欲しい時や、 htmlのプルダウンメニューなんかで、optionタグに1976年〜2020年まで自動で出したい、といった時に使います。


いちいち1976年から2020年まで40行書くのは面倒です。htmlで書くとこうなります。

<select>
  <option>1976年</option>
  <option>1977年</option>
  <option>1978年</option>
  <option>1979年</option>
  <option>1980年</option>
  ︙
  <option>2020年</option>
</select>
PHPなら、
for($i=初期値; $i<=ここにいくまで計算を続ける; $i++){
 表示処理
}
これで済みます。
※$i++ は$iに1づつ足していくという処理です(インクリメント演算子)。後半で説明します。

<?php
for ($i=1976; $i<=2020; $i++) {
  echo "<option>" . $i . "年</option>";
}
?>
変数$iのなかにどんなデータが入って、どんなタイミングで、どんな処理がなされているのかを視覚化しました。

PHPでループ処理ができる関数としてはfor文とwhile文が用意されています。

for文とwhile文の違いとしては、
 for :繰り返す回数が予めわかっている場合。繰り返す回数を指定したい場合
 while:繰り返す回数がわからない場合。特定条件でbreakする場合(無限ループに注意!)
 ※ do whileは1回はループを回して欲しいとき

for文

ある整数  i (Integerインテジャーの略)が、 ある数字になるまで、ある処理を行う、という場合に使います。
for(カウンタを初期設定; ループ処理の条件式; 増減式){
 実行する処理;
}

<?php
for ($i = 0; $i < 10; $i++) {
  echo $i;
}

echo '-------<br>';

for ($i = 0; $i < 10; $i++) {
  if ($i > 5){
    break;   /* breakでループを抜ける */
  }
  echo $i;
}

echo '-------<br>';

for ($i = 0; $i < 10; $i++) {
  if ($i % 2 == 0) {  /* iを2で割った時のあまりが0の場合(2で割り切れた場合、つまり偶数!) */
    continue;   /* continueでスキップする */
  }
  echo $i;
}
?>
解説
 $i = 0  :カウンタ変数に入る数字を0に初期化し
 $i < 10 :この条件を満たしている間{ }内の処理を行いなさい
 $i++  :{ }内の処理が終われば、さらに条件が終了するまで、この式を実行させる

小テスト

1から100まで(100を含む)の整数のうち、5の倍数の合計値を求めよ。

ヒント

<?php
$答え = 0;  /* ← 答え用の変数を用意し、初期化(0にする)しておく */

for (カウンタ変数$iの初期設定; $iの最大数; $iを増加させる処理) {
  もし、$iを 5 で割ったときに余りが 0 の数字であれば、{
    $答え に 「$答え + $i」 という結果を代入し、またforループに戻る。
  }
}

$答え を出力  /* ← for文内で5の倍数が足された結果の数値を出力 */
?>
考え方のポイントとしては、“$答え”を変数にして、ループのたびに新しい数値に上書きして数値を増やしていきます。 答えはこのような出力になります
1050

ヒント:
この章の最初にある、for文の例の一番最後あたりを参考にしてみてください。continueの代わりに、該当した数字を足していくという作業が入ります。
わからないときは紙と鉛筆で計算を書き出して、ループの仕組みを考えてみましょう。
答え

$answer = 0;
for ($i = 0; $i <= 100; $i++) {
  if($i % 5 == 0){
    $answer = $answer + $i;
  }
}
echo $answer;

while文と、do〜while文

while文は、指定した条件式がtrueの間は繰り返し実行しfalseになると止まります。
データベース内のデータを取ってくる時など「全部取ってきて」そして「データが無くなったら(falseになったら)終わって」という処理に使います。
while (ループさせる条件式){
 実行する処理1;
 実行する処理2;
}

<?php
/* 前判定(大きい数字が来ても条件に合わなければ1回も表示させない)*/
$i = 5;            /* 初期設定 */
while ($i < 10) {  /* ① $iが 10 より小さい場合は{処理}を実行。大きくなったら(falseになったら)終了 */
  echo $i;         /* ② いまの$iをecho */
  $i++;            /* ③ いまの$iに 1 を足し、①に戻る */
  echo '
'; } ?>
$i=50の場合は、いきなりfalseになるため何も出力されません

do {
 実行する処理;
} while (ループさせる条件);

<?php
/* 後判定(大きい数字が来ても1回は表示させる)*/
$z = 50;
do {
  echo $z.'
'; $z++; } while ($z < 10); ?>
$i=5の場合は1〜9までの数字が出力されます。

結果

小テスト

1から50までの整数のうち、5の倍数である数字を全て出力する。

<?php
$i = 1;  /* 初期化 */
while ( $iの最大数; ) {
  もし、$iを5で割ったときに余りが0であれば、{
    $iを出力
  }
  $iに1を足し、またループに戻る。
}
?>
答えは以下のような出力になります。
5
10
15
20
25
30
35
40
45
50
答えのコード

$i = 1;
while ($i <= 50) {
  if( $i % 5 == 0){
    echo $i . '
'; } $i++; }

#6 PHPの配列変数は3種類。配列と連想配列と多次元配列

配列変数とは

変数には一つの'値'を入れることが出来ました。

<?php
$name = '大橋太郎';
?>
しかし配列(arrayアレイ)では、変数に複数の'値'を入れることが可能になります。便利ですね。

<?php
$name = array('大橋太郎', '大橋二郎', '大橋三郎');

/* 最近のバージョンでは以下のようにも書けます(PHP5.4以降)。なるべくこちらを使いましょう。 */
$name = ['大橋太郎', '大橋二郎', '大橋三郎'];
?>
$nameという名前の変数に、'大橋太郎', '大橋二郎', '大橋三郎'と3つの値を入れることができました。

<?php
$name = ['大橋太郎', '大橋二郎', '大橋三郎'];
echo $name;        /* 配列はechoやprintでは出力されません。エラーが表示されます。 */
echo '-----------<br>';
print_r ($name);   /* print_r()関数は配列の中身を出してくれます */
?>
代入した順番ごとに勝手に番号が振られます。最初は0番です。

配列変数を添字そえじを使ってデータを出力

配列の中の、一つの要素(データ)を取り出す場合は 添字 [ ] を使います。 添字とは、arrayアレイ内に記述した順に、0,1,2,3,…と自動的に数字が振られますので、 その数字を指定するカッコのことです。変数の末尾につけます。

<?php
$name = ['大橋太郎', '大橋二郎', '大橋三郎'];
echo $name[0] . '<br>';  /* 添字は一つのデータを取り出すことなので、echoも使えます。 */
echo '-----------<br>';
echo $name[1] . '<br>';
echo '-----------<br>';
echo $name[2] . '<br>';
?>
arrayアレイを使わずに直接添字を指定して値を代入することも出来ます。

<?php
$name[0] = 'taro';
$name[1] = 'jiro';
$name[2] = 'saburo';
echo $name[2];  /* saburo が出力されます */
?>

連想配列とは

添字が[0]とか[2]とかだとわかりにくい場合があるので、['name']や['age']みたく、任意の文字列にしたい時があります。
配列(添字配列)と連想配列の違い:添字が「数字」なのか「文字列」なのかの違いです。添字が文字列の場合は連想配列と覚えましょう。

例えばこのようなデータがあったとします。
例)個人データ
氏名 年齢 住所 職業 趣味
大橋太郎 32歳 目黒区大橋1-2-5 公務員 キャンプ


<?php
/* 連想配列で複数の値を配列にセットするには「=>」を使います */
$data = [
  'name'=>'大橋太郎',
  'age'=>'32歳',
  'add'=>'目黒区大橋1-2-5',
  'job'=>'公務員',
  'hobby'=>'キャンプ'
];
echo $data['job'];  /* 公務員 が出力されます */
?>
配列の場合は、IDは[0]、氏名は[1]、年齢は[2]、xxは[23]…という具合になります。
全員の趣味のデータを表示しようとした場合[5]をechoしないといけませんが、数字をいちいち覚えておくのも億劫です。 そこで、IDは[id]、氏名は[name]、年齢は[age]、趣味は[hobby]というふうに、名称をつけてあげたほうが可読性が上がります。

まとめ

変数 箱にデータが一つある状態
$data = 'taro';
配列変数 箱の中に複数のデータがある状態
① $data = ['taro', 'jiro', 'goro'];
② $data = ['name'=>'taro', 'job'=>'事務', 'age'=>'32'];
--データを出力する時--
添字配列:キーが数字 $data[1]
連想配列:キーが文字 $data['job']

多次元(二次元)配列とは

連想配列はデータベースのデータを出力する際によく使います。
例えばこのような個人データがある場合、項目とデータがかなりの数がある場合があります。

例)個人データ
ID 氏名 年齢 住所 職業 趣味
1 大橋太郎 32歳 目黒区大橋1-2-5 公務員 キャンプ
2 池尻次郎 28歳 目黒区池尻1-2-5 家事手伝い 映画鑑賞
3 大橋三郎 25歳 渋谷区北沢2-3-6 デザイナー ドライブ

多次元とつく配列の場合は、ID,氏名,年齢,xxx...をひとまとまりにした(ここでいえば人に当たる)配列、 つまり配列(大きな箱)の中に配列(小さな箱)がある状態のことを指します。配列変数がたくさんあるような状態です。


<?php
$data = [];  /* 初期化 */

/* 多次元連想配列としてデータ入力する書き方 */
$data = [
  ['1', '大橋太郎', '32歳', '目黒区大橋1-2-5', '公務員', 'キャンプ'],
  ['2', '池尻次郎', '28歳', '目黒区池尻1-2-5', '家事手伝い', '映画鑑賞'],
  ['3', '大橋三郎', '25歳', '渋谷区北沢2-3-6', 'デザイナー', 'ドライブ']
];
?>

/*出力するには*/
echo $data[0][1]; のように添字を並べてデータを出力します。
最初の[0]は大きな箱の番号です。連番になります。次の[1]は大きな箱の中の小さな箱の番号です。

小テスト

$data[2][2]をechoすると、何が出力されますか? PHPを書かないで答えてみましょう。
答え

25歳

#7 PHPで配列のループ処理

foreach文

foreach文は、配列に含まれる'要素の数'だけ繰り返し処理が行われ、そのたびに配列に含まれる要素の''を'変数に代入'します。

for文とforeach文の違い

 ループさせるのに使う“値”が違う
 for   :数値。連想配列を使用していない。配列の中身を書き換たい場合
 foreach :配列。配列や連想配列、配列の中身を書き換える必要が無い場合

使い方

foreach (配列 as 変数){
  実行する処理1;
  実行する処理2;
}
/* キーも一緒に取り出したい場合「=>」を使って取り出します
   キーは配列の添字番号のことです */
foreach (配列 as キー変数 => 値変数){
  実行する処理1;
  実行する処理2;
}

<?php
$name = ['大橋太郎', '大橋二郎', '大橋三郎'];
foreach($name as $val){     /* ① $nameの中身の最初[0]を取得し$valに代入 */
  echo $val.'
'; /* ② $valを出力し、$nameの中身がなくなるまで「① に戻って次の値を取得」を繰り返す */ } echo 'ーーーーーーーー
'; $data = ['name'=>'taro', 'job'=>'事務', 'age'=>32]; foreach($data as $key => $val){ /* 1こめの $key は 'name' $val は 'taro' */ echo $key.':'.$val.'
'; } echo 'ーーーーーーーー
'; $study = ['math'=>95, 'eng'=>56, 'kokugo'=>100]; foreach($study as $val){ /* もちろん連想配列から「値のみ」の出力も可能です */ echo $val.'
'; } ?>

foreach文にはwhile文やfor文などと異なり、繰り返しが終了される条件式は存在しません。 配列の要素の数だけ繰り返して終了となります。

小テスト

以下のような個人データのテーブルデータがあります。
以下と同様の表を、多次元連想配列をforeachし、tableタグをechoして作ってください。
ID 氏名 年齢 住所 職業 趣味
1 大橋太郎 32歳 目黒区大橋1-2-5 公務員 キャンプ
2 池尻次郎 28歳 目黒区池尻1-2-5 家事手伝い 映画鑑賞
3 大橋三郎 25歳 渋谷区北沢2-3-6 デザイナー ドライブ

ヒント

<?php
/* データは以下を利用してください */
$data = [
  ['1', '大橋太郎', '32歳', '目黒区大橋1-2-5', '公務員', 'キャンプ'],
  ['2', '池尻次郎', '28歳', '目黒区池尻1-2-5', '家事手伝い', '映画鑑賞'],
  ['3', '大橋三郎', '25歳', '渋谷区北沢2-3-6', 'デザイナー', 'ドライブ']
];

/* おそらくこんな感じです */
echo '<table>';
  foreach (多次元配列 as 変数){
    echo '<tr>';
      どんな処理が入るでしょうか?
    echo '</tr>';
  }
echo '</table>';
?>
データはこのようになっています。何をechoすればどんなデータが出力できるか、頭の中でシミュレーションしてみましょう。
答え

$data = [
  ['1', '大橋太郎', '32歳', '目黒区大橋1-2-5', '公務員', 'キャンプ'],
  ['2', '池尻次郎', '28歳', '目黒区池尻1-2-5', '家事手伝い', '映画鑑賞'],
  ['3', '大橋三郎', '25歳', '渋谷区北沢2-3-6', 'デザイナー', 'ドライブ']
];

echo '<table>';
  foreach ($data as $val){
    echo '  <tr>';
    echo '    <td>' . $val[0] . '</td>';
    echo '    <td>' . $val[1] . '</td>';
    echo '    <td>' . $val[2] . '</td>';
    echo '    <td>' . $val[3] . '</td>';
    echo '    <td>' . $val[4] . '</td>';
    echo '    <td>' . $val[5] . '</td>';
    echo '  </tr>';
  }
echo '</table>';
ソースをきれいにするために半角で開けてインデントを開けていますが、お任せします。

【重要】変数のまとめ

値を保持する種類状態入力出力
変数箱に一つデータを入れた状態$data = 'りんご';echo $data;
配列箱に複数のデータを入れた状態(添字は数値)$data = ['りんご', 'みかん', 'なし'];echo $data[2];
連想配列配列と同じで添字が文字列になった状態$data = ['name'=>'さとう', 'age'=>'23歳', 'hobby'=>'テニス'];echo $data['name'];
多次元配列配列の中に配列が複数入っている状態 //多次元(二次元)配列
$data = [
 ['うえの', '27歳', 'ゴルフ'],
 ['なしもと', '27歳', '釣り']
];

//多次元連想配列①
$data = [
 ['name'=>'うえの', 'age'=>'27歳', 'hobby'=>'ゴルフ'],
 ['name'=>'なしもと', 'age'=>'27歳', 'hobby'=>'釣り']
];
//多次元連想配列②
$data = [
 'fruits' => ['orange', 'banana', 'apple'],
 'veggie' => ['carrot', 'collard', 'pea']
];
echo $data[0][1];


echo $data[0]['age'];


echo $data[fruits][0];
※配列の添字は[0]から始まる
※配列はechoできない。echoしたいときは添字をつけること。
※配列の中身全てを見るときはprint_r()関数を使う。
※※配列は厳密に言えば順番付けられたマップであり、データ型の一種です。配列が入った変数を「配列変数」と呼んでいる。

★データを取り出す関数(ループ処理)
関数説明
forある処理を、繰り返す回数が予めわかっている場合。繰り返す回数を指定したい場合。falseになると終了。
whileある処理を、特定の条件の間だけ繰り返したい場合。条件を満たすまで出力を続ける。
foreach配列や連想配列、多次元配列を(添字をつけて)全て出力する。
powerd by