PHP レッスン — レッスン 12 — while、foreach、for ループ
プログラミングでも、日常でも、結果に満足するまで繰り返しの動作を行わなければならないことがよくあります。日常ではこれを苦役と呼び、プログラミングではループ(loops)と呼びます。ループは PHP で非常によく見かけます。配列をたどったり、関数を計算したり、そのほかループでできることは多いからです。最もシンプルで最も人気のある while から始めましょう。
PHP while ループ
while はとてもシンプルです。丸括弧の中に条件を書き、波括弧の中に条件が満たされたときに何をするかを書きます。条件は、TRUE か FALSE の 2 つの状態を持つ論理式です。論理式についてもう一度理解したいなら、if 演算子のレッスンを読むとよいでしょう。では while の例です:
<?php
$counter = 5;
$newArray = array();
while($counter > 2){
$newArray[]= $counter;
$counter--;
}
print_r($newArray);
?>
その結果、配列の要素 5,4,3 が出力されます。何が起きたか見てみましょう:
ステップ 1。$counter = 5(5 > 2)
ステップ 2。$counter = 4(4 > 2)
ステップ 3。$counter = 3(3 > 2)
ステップ 4。$counter = 2(2 = 2、条件が満たされなくなったので動作も起きず、配列に 2 はない)
もう 1 つの例、関数 y(x) = 2x -1 の表化を見てみましょう:
<?php
// 関数 y(x) = 2x -1;
$x = -10;
while($x <= 10){
$y = 2*$x-1;
print 'y(' . $x . ')=' . $y . '<br />';
$x++;
}
?>
その結果、x が [-10,10] のときの関数の値が縦に出力されます。

これは while ループのフローチャート、このループの動作の全体像です。条件があり、ループの本体があります。条件が満たされる間、ループの本体が動作し、満たされなくなると、php は次のコードの実行に進みます。
もう 1 つ重要な点。$x++ の行を消すと、カウンターが変化しなくなり、条件が満たされなくなることがなくなります。もし条件が常に満たされるとどうなるでしょう?
<?php
// 関数 y(x) = 2x -1;
$x = -10;
while($x <= 10){
$y = 2*$x-1;
print 'y(' . $x . ')=' . $y . '<br />';
// $x++;
}
?>
その場合、とても、とてもまずいことになります。致命的なエラーが発生し、ループの本体が永遠に実行されます。この状況を無限ループと呼びます。そうした状況を避けてください。無限ループはあなたのサイトが動作しなくなる原因になり得ます!
PHP foreach ループ
もう 1 つの必要なループで、配列をたどる必要があるときによく見かけます。たどるとは、配列の 1 つの要素を取り、それに対して動作を行い、次に配列の次の要素を取り、それに対して同じ動作を行う、という具合に、すべての要素を通っていくことを意味します。
これを例で見てみましょう。「赤」と「青」の 10 個の要素があるとして、赤い要素の数を数えましょう:
<?php
$counter = 0;
$newArray =array(
1=>'赤',
2=>'青',
3=>'青',
4=>'赤',
5=>'赤',
6=>'青',
7=>'赤',
8=>'青',
9=>'赤',
10=>'青',
);
foreach($newArray as $key){
if($key == '赤'){
$counter++;
}
}
print '赤い要素が ' . $counter . ' 個あります';
?>
この簡単な例で、すべて分かると思います。この場合、as 演算子は要素を 1 つずつたどるために使われます。要素が尽きると、foreach の実行が終わります。
しかし、すべての配列がこれほど簡単なわけではなく、配列が多くのネストした配列を含むこともあります。これらのサブ配列のそれぞれも、同じようにたどれます:
<?php
$counter = 0;
$newArray = array(
1=>array(
1 => '赤',
2 => '青',
3 => '青',
),
2=>array(
1 => '赤',
2 => '赤',
3 => '青',
)
);
foreach($newArray as $key){
foreach($key as $element){
if($element == '赤'){
$counter++;
}
}
}
print '赤い要素が ' . $counter . ' 個あります';
?>
foreach については今のところそれなりに分かったと思います。ひとまずここで区切りましょう。foreach はこの後の私の例でも出てきます。
FOR ループ
for ループは while ループに似ています。for は通常、ループの繰り返し回数があらかじめ分かっているときに使います。例えば 10 回や 100 回の繰り返しです:
for($i=0;$i<10;$i++){
// 10 回の繰り返し
}
では、for ループが何で構成されているか見てみましょう。
for(){
}
前のループと同じように、for ループのすべてのパラメーターは丸括弧の中に書きます。通常、3 つのパラメーターを使います:
1. $i=0 - カウンターの初期化。現在の繰り返しの番号を記録する変数です。
2. $i<10 - for ループが動作する条件。
3. $i++ - 次の繰り返しへ進むための、カウンターの 1 ずつの増加。