Friction River Software

  • お問い合わせ

CakePHP5入門【PHP言語の文法編③】繰返し

B美

さて今回は「繰返し」処理について説明していくよ
ちなみに、一般的には「ループ」と呼ぶことが多いわね(語源は英語の「Loopループ」)

まずは前々回作った「test2.php」を改造して、新たなファイル「test5.php」を作るよ

B美

以下のように書き換えてから「test5.php」というファイル名で保存してね

<?php
$array = [1, 2, 3, 4, 5];
$hash = ['first' => 'A子', 'second' => 'B美', 'third' => 'C菜'];

foreach ($array as $value) {
 echo $value."<br />";
}

foreach ($hash as $index => $value) {
 echo "キーワード".$index."の値は".$value."<br />";
}


?>

コードの説明は後でするから、とりあえずは実行確認してみてちょうだい



A子

あー、なるほど
配列の中身を全て表示するって処理かな?

C菜

だと思うです~

それに連想配列である$hashのほうなんか、キーワードと値の両方が表示されてますよ~

B美

実はPHPにおける「繰返し」の処理って、文法的には4種類あるんだけどさ

最も多く使うのが、この「foreachフォーイーチ」だと思って良いよ
(ループ処理の8~9割はこれだね)

A子

それじゃー、ほかの3つの勉強は要らないの?

B美

んなわけあるかいっ!

生成AIやほかの人が書いたコードを読めなくなっちゃうじゃん
(なので一通りの知識は必要よ)

C菜

えっと、そんなことより文法の説明をしてほしいです~

foreach ($array as $value) {
 echo $value."<br />";
}

なので
foreach (配列名 as 変数名) {
 配列要素の数だけ、繰り返される部分  
 (変数には配列の要素が順番に入る)
}

…ってことで良いですかぁ~?

B美

お、さすがはC菜ね
理解が早い

サンプルコードの一つ目のパターンがそれね

A子

それじゃ、サンプルコードの二つ目のパターンは…

foreach ($hash as $index => $value) {
 echo "キーワード".$index."の値は".$value."<br />";
}

…ってことだから
foreach (配列名 as キーワードを入れる変数名 => 値を入れる変数名) {
 配列要素の数だけ、繰り返される部分  
 (二種類の変数には配列のキーと値が順番に入る)
}

になるのかしら?

B美

大正解!

なお、二つ目のパターンにおいて、処理対象が(「連想配列」ではなく)普通の「配列」だった場合は、「キーワードを入れる変数名」の部分が「配列の添字が格納される変数名」になるわよ
(当然、その値は「0~(配列の要素数-1)」まで)

あ、あとね
変数名は自由に付けられるんだけど、さっきの「$index」のところって、普通の配列の場合は「$idx」、連想配列の場合は「$key」にすることが多いかな
(そのほうが分かりやすいからね)

C菜

今のお話を踏まえて、さっきの「test5.php」を少し書き換えてみました~

<?php
$array = [1, 2, 3, 4, 5];
$hash = ['first' => 'A子', 'second' => 'B美', 'third' => 'C菜'];

foreach ($array as $idx => $value) {
 echo "添字[".$idx."]の値は".$value."<br />";
}

foreach ($hash as $key => $value) {
 echo "キーワード".$key."の値は".$value."<br />";
}

?>



B美

すばらしい!

A子も面倒くさがらずに、積極的に「試行錯誤トライ&エラー」してみなさいね

A子

へいへい

んで、残り3つのループは?

B美

次は「whileホワイル」ね
これは「foreachフォーイーチ」の次によく使うと思うわ

さっきの「test5.php」を改造して「test6.php」を作りましょう

<?php
$array = [1, 2, 3, 4, 5];

$i = 0;
while ($i < count($array)) {
 echo $array[$i]."<br />";
 $i++;
}


?>

打ち終わったら「test6.php」というファイル名で保存して、ブラウザで確認してみてね
(URLは「localhost/test6.php」)



A子

配列の中身が全部表示されたのは、さっきと同じだね

「count($array)」は配列$arrayの要素数を得るってことかな?

B美

その通り!
「count($array)」の部分が、この例だと「5」に置き換わると考えれば良いわ

で、処理の流れだけど…
.まずはwhileの条件式を評価(条件判断)するの
.変数$iの初期値は0ゼロだから「$i < 5」は「true(真)」よね?
.その場合、ループ本文…直後のブロック内(波カッコの内側)…が実行されるわ
.そこにある「$i++;」は変数$iを「1」だけ増加させるって意味ね(「インクリメント」と呼びます)
.んで重要なのが、ループ本文の実行が終わったら(ループを抜けることなく)再度whileの条件式評価に戻るってこと
.もしもそれが「false(偽)」であれば、ループを抜ける(ループ本文には入らずに次の処理へと進む)のよ

C菜

えっ~と、ループの1回目は変数$iが0ゼロで、ループ内で1になるです~

・ループ2回目は変数$iが1から2に
・ループ3回目は変数$iが2から3に
・ループ4回目は変数$iが3から4に
・ループ5回目は変数$iが4から5に

で、最後に「$i < 5」を評価するとき、「5 < 5」になるから「false(偽)」になってループを抜けるってことですね~?

B美

さすがね
結局、条件式の評価は6回、ループ本文は5回実行したってことになるわ

あ、めちゃくちゃ大事なことなんだけど、もしも「$i++;」を書き忘れたらどうなると思う?

A子

ん?いつまでたっても変数$iは0ゼロのままじゃないの?

あれ?それってループを抜けられる?

B美

抜けられないわね(苦笑)
その状態を通称「無限ループ」と呼んでるわ

「無限ループ」に入っちゃうとブラウザが無反応フリーズ状態っぽくなるから、あわてず騒がずブラウザ左上の「×(中止ボタン)」を押して処理を中断すること
(実際にフリーズするわけではありません)

A子

ねぇ、「インクリメント」が1増加だったら、1減らすって命令もあるんじゃないの?

B美

お、良い勘してるー

変数名の前か後に「--」を付けると、1減らす処理になって、それを「デクリメント」と呼びます
(「++$i」と「$i++」がインクリメント、「--$i」と「$i--」がデクリメントってこと)

C菜

「++」や「--」を変数の前に付けるか、後に付けるかで意味が変わってくるんですか~?

B美

一行の中に記述する(「$i++;」と「++$i;」)なら同じ意味ね
ただ、$array[$i++]や$array[++$i]では意味が変わってくるのよ

$array[++$i]
 ↓
$i++;
$array[$i]


$array[$i++]
 ↓
$array[$i]
$i++;

…ってこと
要するに、$iを評価するタイミングと$iをインクリメントするタイミングが先なのか後なのか…ってわけ

A子

むー、ややこしいな

それって無理に覚えなくても良いよね?

B美

まぁね(苦笑)
一般的には「$i++;」を単独で使うってパターンが多いかな

C菜

理解したです~

B美

それじゃ、次へ行きましょう

お次は「do whileドゥーホワイル」よ
さっきの「test6.php」を書き換えて「test7.php」というファイル名で保存します

<?php
$array = [1, 2, 3, 4, 5];

$i = 0;
do {
 echo $array[$i]."<br />";
 $i++;
} while ($i < count($array));

?>

さっきは先頭にあったwhileの条件式が、この例では末尾に来てるわよね
もう分かったでしょう?



C菜

これってループ本文を実行してから、先頭(do)に戻るかを条件判断する…ってことでしょうか~?

B美

そう、これを「後判断あとはんだんループ」と言います

その特徴は「ループ本文を必ず1回は実行する」ってことね

A子

ん?あっ!そうか

whileってまず条件判断から始まるから、もしもそれが「false(偽)」だったらループに入らないね
つまり、一度もループ本文に入らないことがあるかもしれない処理ってことか

B美

そうなのよ
それを「前判断まえはんだんループ」と呼んでるわ

ここまではそんなに難しくはないでしょう?

C菜

大丈夫です~

A子

まぁ、なんとか喰らいついていってる感じかな(苦笑)

B美

ループの最後は「forフォー」文よ

はっきり言って、一番ややこしいのに一番使わない処理かもね
「test6.php」を書き換えてから「test8.php」というファイル名で保存してね

<?php
$array = [1, 2, 3, 4, 5];

for ($i = 0; $i < count($array); $i++) {
 echo $array[$i]."<br />";
}


?>

forのカッコ内は;セミコロンで区切られた三つの式から成っているの
つまり、「for (式1; 式2; 式3)」ってことね



C菜

あ、わかっちゃいましたぁ~

実行結果から考えると

$i = 0;
while ($i < count($array)) {
 echo $array[$i]."<br />";
 $i++;
}



for ($i = 0; $i < count($array); $i++) {
 echo $array[$i]."<br />";
}

は同じ意味なんですね~?

A子

ええっと、つまり…

式1がループに入る前に1回だけ実行されて
式2は条件判断(前判断ループ)で「true(真)」ならループに入る
式3がループ本文の最後に実行される部分で
・その式3を実行したあと式2に戻って、再度条件式を評価する

…ってことかな?

B美

大正解!
二人ともやるじゃん

ただね
「foreach」があるでしょ?
だから「for」の出番はほとんど無いのよね(苦笑)

C菜

たしかに「foreach」のほうがすっきりシンプルで分かりやすいと思うです~

A子

覚えやすいしね(笑)

B美

さてこれで「繰返しループ」に関する説明は終了よ

次回は文法編の最後である「関数」について説明していきます
お楽しみに!