概要
繰り返し処理は、決まった回数や条件を満たしている間は同じ処理を繰り返し行う場合に使用する。
ここでは、for
文、while
文、foreach
文の使用方法について記載する。
for文
for文の基礎
繰り返し処理では、条件式を評価して繰り返しを継続するかどうか判別する。
条件式には色々な条件を記述することができるが、決められた回数だけ繰り返すといった処理に使用される。
変数の値を変化させて条件式で評価する場合、for
文を使用すると簡潔に記述することができる。
for
文に書式は、以下の通りである。
for(初期化式; 条件式; 変化式)
{
実行する処理1;
実行する処理2;
}
for
文では初期化式、条件式、変化式の3つを記述する。
- 初期化式
for
文の処理が開始される時に1度だけ実行されて、通常は条件式の中で使用される変数等の初期化を行う式を記述する。
- 条件式
while
文と同様、繰り返しを継続するかどうかの判定に使用する。- 条件式の評価が真ならばブロック内の処理を実行する。偽ならば
for
文を終了する。
- 変化式
- 一般的に、条件式の中で使用される変数等を、繰り返しが1回行われるごとに変化させるための式を記述する。
for($count = 0; $count < 10; $count++)
{
// 実行する処理
}
実行する処理が1つのみの場合、ブロックを省略して記述してもよい。
for(初期化式; 条件式; 変化式)
実行する処理;
なお、while
文と同様、break
やcontinue
を使用することが可能である。
for文で複数の変数を変化させる
for
文は、複数の式を記述することができる。
この場合、カンマで区切って必要な分の式を記述する。
for(初期化式1, 初期化式2, ..; 条件式; 変化式1, 変化式2, ..)
{
実行する処理1;
実行する処理2;
}
以下の例では、for
文において、2つの変数の初期化式と変化式を記述している。
初期化式として変数xに0、変数yに10を代入している。
そして、繰り返しが1回実行されるごとに、変数xの値を1加算、変数yの値を1減算している。
for($x = 0, $y = 10; $x < 10; $x++, $y--)
{
print 'x='.$x.',y='.$y;
}
foreach文
foreach文の基礎
foreach
文は、配列に含まれる各要素の値を順に取り出す場合に使用する。
書式は、以下の通りである。
要素を取り出す配列と、取り出した要素の値を格納する変数を指定する。
foreach
文では、配列に含まれる要素の数だけ繰り返しが実行されて、1回繰り返しを行うごとに配列に含まれる要素の値を変数に代入する。
foreach(配列変数 as 変数)
{
実行する処理1;
実行する処理2;
}
以下の例では、配列の要素の値を順に取り出して表示している。
$preflist = array('東京', '大阪', '名古屋');
foreach($preflist as $pref)
{
print $pref;
}
for
文やwhile
文とは異なり、繰り返しの終了を示す条件式は存在しない。配列の要素数分を繰り返して終了する。
なお、for
文やwhile
文と同様、break
やcontinue
を使用することが可能である。
※注意
配列の要素そのものを取り出しているわけではなく、要素の値を変数にコピーして代入しているだけである。
foreach文を使用して、配列の要素の値を変更する場合は、次のセクション"foreach文で配列要素の値を変更する"を参照すること。
foreach文でキーと値を取り出す
foreach文では、要素の値の他に、キーを取り出す構文も存在する。
繰り返しが1回行われるごとに、配列に含まれる要素の値を値変数に代入すると同時に、キーの値をキー変数に代入する。
書式は、以下の通りである。
foreach(配列変数 as キー変数 => 値変数)
{
実行する処理1;
実行する処理2;
}
以下の例では、繰り返しごとに配列の要素のキーと値を取り出して表示している。
$preflist = array('Tokyo' => '東京', 'Osaka' => '大阪');
foreach($preflist as $key => $value)
{
print $key.'=>'.$value;
}
foreach文で配列要素の値を変更する
foreach
文で要素の値を変数に格納すると、値のコピーが変数に代入される。
そのため、要素の値を使用することはできるが、要素の値を変更することはできない。
値とキーを取得して、配列変数に対して要素の値を変更することも可能であるが、以下の書式を使用することもできる。
foreach(配列変数 as &変数)
{
実行する処理1;
実行する処理2;
}
変数の前に&
を付加することで、要素の値に対する参照を設定することができる。
したがって、変数に対して新しい値を代入することにより、要素の値を変更することが可能になる。
以下の例では、要素の値に対する参照を取得して、各要素の値を1.05倍して再度格納している。
最後にunset
関数を呼び出しているのは、foreach
文が終了しても変数valueには配列の最後の要素に対する参照が設定されたままであるため、
その後の処理で、誤って要素の値を変更できないように変数の割り当てを明示的に解除している。
$pricelist = array(80, 100, 120);
foreach($pricelist as &$value)
{
$value *= 1.05;
}
unset($value);
while文
while文の基礎
while文は、指定した条件式が真の間、繰り返しを実行する。
繰り返し回数が決まっていない場合に有効な構文である。
書式は、以下の通りである。
条件式は、if文と同様、比較演算子を使用して、x == 10、y > 15等と記述する。
条件式が真である場合、ブロック内に記述された処理を実行する。
そして、改めて条件式を評価して、真であれば再度ブロック内の処理を実行して、偽ならばwhile文を終了する。
while(条件式)
{
実行する処理1;
実行する処理2;
}
また、実行する処理が1つのみの場合は、ブロックを省略して記述してもよい。
while(条件式)
実行する処理;
以下の例では、変数numが2になるまで変数numの値を出力している。
$num = 0;
while(num < 2)
{
print "num=".$num;
$num += 1;
}
また、while文の処理の中でさらに別のwhile文を記述することもできる。
以下の例では、外側のwhile文が1回実行されるごとに内側のwhile文が3回実行される。
2つの条件を変化させながら繰り返し処理を実行することは頻繁にある。
$i = 0;
while($i < 3)
{
$j = 0;
while($j < 3)
{
print '(i, j)=('.$i.','.$j.')';
$j += 1;
}
$i += 1;
}
breakとcontinue
break
繰り返し処理の中でbreak
を実行すると、繰り返し処理を終了させることができる。
break
は、繰り返し処理の他にswitch
文でも使用される。
以下の例では、変数の値を1から100まで変化させて合計した値を表示している。
合計した値が1000を越える場合はbreak
を実行して、while
文を終了している。
このように、break
を使用することで任意のタイミングでfor
文やwhile
文を終了することが可能となる。
$count = 1;
$sum = 0;
while($count <= 100)
{
$sum += $count;
if($sum > 1000)
{
print '1000を越えたので count = '.$count.' で終了します';
break;
}
$count += 1;
}
// breakが実行された時に処理が移る位置
print 'sum = '.$sum;
また、ネストされた繰り返し処理において、break
に数値を記述すると、抜ける繰り返し処理の階層を指定することができる。
break <階層数>;
以下の例では、break
が実行された時に、2階層分の繰り返し処理を抜けている。
このように、break
を使用することで、単純に繰り返し処理を抜けるだけではなく、何階層抜けるのかを指定することも可能である。
$i = 1;
while($i < 5)
{
$j = 1;
while($j < 5)
{
if($i * $j > 15)
{
break 2;
}
$j += 1;
}
$i += 1;
}
// breakが実行された時に処理が移る位置
continue
繰り返し処理の中でcontinue
を実行する時、繰り返し処理のブロック内でそれ以降の処理を実行せずに、次の条件式の評価を行う。
以下の例では、変数の値を1から100まで変化させて合計した値を出力している。
while
文の処理の中で、加算しようとする値が2の倍数である場合は、加算を行わずに次の条件式の評価へ処理が移る。
このように、continue
を使用することにより、細かく繰り返し処理を制御することが可能となる。
$count = 0;
$sum = 0;
while($count < 100)
{
$count += 1;
if($count % 2 == 0)
{
continue;
}
$sum += $count;
}
print 'sum = '.$sum;
また、ネストされた繰り返し処理において、break
と同様に階層数を指定することで、何階層を抜けて条件式の評価に戻るのかを指定することができる。
continue <階層数>;
以下の例では、continue
が実行された時、2階層分の残りの繰り返し処理を飛ばして、外側(while文)の条件式の評価に処理が移る。
break
と同様、continue
を使用することにより、繰り返し処理の制御をより細かく行うことができる。
$count1 = 0;
$sum = 0;
while($count1 < 10)
{
$count1 += 1;
$count2 = 0;
while($count2 < 10)
{
$count2 += 1;
if($count1 * $count2 > 30)
{
continue 2;
}
$sum += $count1 * $count2;
}
}
print 'sum = '.$sum;
do-while文
do-while文は、必ず1回は処理を行う場合に有効な構文である。
書式は、以下の通りである。
do
{
実行する処理1;
実行する処理2;
} while(条件式);
do-while文では、まず、ブロック内の処理が実行された後で条件式の評価が行われる。
そのため、少なくとも1回は必ずブロック内の処理が実行される。
条件式の評価が真であれば再度先頭に戻りブロック内の処理を実行して、偽ならばdo-while文を終了する。
実行される処理が1つのみの場合は、ブロックを省略して記述してもよい。
do {
実行する処理;
} while (条件式);
以下の例では、変数numが2になるまで変数numの値を出力している。
$num = 0;
do
{
print "num=".$num;
$num += 1;
}while(num < 2);
なお、for
文やwhile
文と同様、break
やcontinue
を使用することが可能である。
※注意
PHPのdo-while文では、末尾のセミコロンは文法的に必須であるが、セミコロンが無くても動作することがある。
これは、PHPのパーサーが寛容な設計である、あるいは、内部的に文の終わりを推測できる場合があるためである。
ただし、PHPではセミコロンを省略するのは推奨されない。
これは、コードの可読性が低下する、PHP言語仕様に準拠していない、IDEや静的解析ツールが警告を出す可能性があるためである。