作成日:2021/04/12 更新日:2022/07/04

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

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

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

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

/* 変数への初期設定 */
$ageA = 50;
$ageB = 19;
変数に値を代入


/* 書き方 */
if( 条件 ) {
  真の時に実行される処理;
}

/* 例 */
if ($ageA >= 20 || $ageA == 100) {
  echo "お酒はOK!";
}
単純な条件式(if文)の場合


/* 書き方 */
if( 条件 ) {
  真の時に実行される処理;
} else {
  偽の時に実行される処理;
}

/* 例 */
if ($ageA > 20) {
  $message = "大人ですね";
} else {
  $message = "子どもですね";
}
echo $message;
条件で分岐する場合


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

/* 例 */
if ($ageB < 20) {
  $message = "こどもだ";
} elseif ($ageB < 59) {
  $message = "おとなだ!";
} else {
  $message = "おじいちゃんかな?";
}
echo $message;
条件が複数分岐の場合


/* 書き方 */
( 条件 ) ? 真の時に実行される処理 : 偽のの時に実行される処理;

/* 例 */
$message = ($ageB > 20) ? "大人ってことで" : "子どもってことで";
echo $message;
三項演算子


出力の例

#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>1981年</option>
  <option>1982年</option>
  ︙
  <option>2018年</option>
  <option>2019年</option>
  <option>2020年</option>
</select>
PHPなら、
for($i=最初の値; $i<=終わりの値; $i++){
  表示処理
}
これで済みます。
※ $i++ は$iに1づつ足していくという処理です(インクリメント演算子)。後半で説明します。

<select>
<?php
for ($i=1976; $i<=2020; $i++) {
  echo "<option>" . $i . "年</option>";
}
?>
</select>
変数$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 '-------';

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

echo '-------';

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
while (ループさせる条件式){
  実行する処理1;
  実行する処理2;
}

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

<?php
$z = 50;
do {
  echo $z.'
'; $z++; } while ($z < 10); ?>
do〜whileは後判定。(最初に大きい数字が来ても、1回は表示させる)
$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の配列変数

配列変数とは


<?php
$name = '大橋太郎';
?>
変数には一つの'値'を入れることが出来ました。

しかし配列(arrayアレイ)では、変数に複数の値を入れることが可能になります。便利ですね。

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

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

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

添字そえじでデータを出力

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

<?php
$name = ['大橋太郎', '大橋二郎', '大橋三郎'];
/* 添字をつけると一つのデータを取り出すことができる。echoで一つだけ出力。 */
echo $name[0] . '
'; /* 0番目 */ echo '-----------
'; echo $name[1] . '
'; /* 1番目 */ echo '-----------
'; echo $name[2] . '
'; /* 2番目 */ ?>
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 = [
  '大橋太郎',
  '32歳',
  '目黒区大橋1-2-5',
  '公務員',
  'キャンプ'
];
echo $data[3];  /* 公務員 が出力されます */


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

まとめ

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

多次元(二次元)配列

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

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

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


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

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

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

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

foreach文

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

for文とforeach文の違い

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

for($i = 0; $i < 10; $i++){
  echo $i;
}
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でechoし、以下と同tableタグの表を作ってみましょう。
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>';
      どんな処理が入るでしょうか?
      <td>をechoすることは想像できますね
    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配列や連想配列、多次元配列を(添字をつけて)全て出力する。