CakePHP5入門【PHP言語の文法編③】繰返し
B美
ちなみに、一般的には「ループ」と呼ぶことが多いわね(語源は英語の「Loop」)
まずは前々回作った「test2.php」を改造して、新たなファイル「test5.php」を作るよ
B美
<?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美
最も多く使うのが、この「foreach」だと思って良いよ
(ループ処理の8~9割はこれだね)
A子
B美
生成AIやほかの人が書いたコードを読めなくなっちゃうじゃん
(なので一通りの知識は必要よ)
C菜
foreach ($array as $value) {
echo $value."<br />"; } |
なので
foreach (配列名 as 変数名) {
配列要素の数だけ、繰り返される部分
(変数には配列の要素が順番に入る)
}
…ってことで良いですかぁ~?
B美
理解が早い
サンプルコードの一つ目のパターンがそれね
A子
foreach ($hash as $index => $value) {
echo "キーワード".$index."の値は".$value."<br />"; } |
…ってことだから
foreach (配列名 as キーワードを入れる変数名 => 値を入れる変数名) {
配列要素の数だけ、繰り返される部分
(二種類の変数には配列のキーと値が順番に入る)
}
になるのかしら?
B美
なお、二つ目のパターンにおいて、処理対象が(「連想配列」ではなく)普通の「配列」だった場合は、「キーワードを入れる変数名」の部分が「配列の添字が格納される変数名」になるわよ
(当然、その値は「0~(配列の要素数-1)」まで)
あ、あとね
変数名は自由に付けられるんだけど、さっきの「$index」のところって、普通の配列の場合は「$idx」、連想配列の場合は「$key」にすることが多いかな
(そのほうが分かりやすいからね)
C菜
<?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美
これは「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」に置き換わると考えれば良いわ
で、処理の流れだけど…
1.まずはwhileの条件式を評価(条件判断)するの
2.変数$iの初期値は0だから「$i < 5」は「true(真)」よね?
3.その場合、ループ本文…直後のブロック内(波カッコの内側)…が実行されるわ
4.そこにある「$i++;」は変数$iを「1」だけ増加させるって意味ね(「インクリメント」と呼びます)
5.んで重要なのが、ループ本文の実行が終わったら(ループを抜けることなく)再度whileの条件式評価に戻るってこと
6.もしもそれが「false(偽)」であれば、ループを抜ける(ループ本文には入らずに次の処理へと進む)のよ
C菜
・ループ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子
あれ?それってループを抜けられる?
B美
その状態を通称「無限ループ」と呼んでるわ
「無限ループ」に入っちゃうとブラウザが無反応状態っぽくなるから、あわてず騒がずブラウザ左上の「×(中止ボタン)」を押して処理を中断すること
(実際にフリーズするわけではありません)
A子
B美
変数名の前か後に「--」を付けると、1減らす処理になって、それを「デクリメント」と呼びます
(「++$i」と「$i++」がインクリメント、「--$i」と「$i--」がデクリメントってこと)
C菜
B美
ただ、$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菜
B美
その特徴は「ループ本文を必ず1回は実行する」ってことね
A子
whileってまず条件判断から始まるから、もしもそれが「false(偽)」だったらループに入らないね
つまり、一度もループ本文に入らないことがあるかもしれない処理ってことか
B美
それを「前判断ループ」と呼んでるわ
ここまではそんなに難しくはないでしょう?
C菜
A子
B美
はっきり言って、一番ややこしいのに一番使わない処理かもね
「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菜
A子
B美
次回は文法編の最後である「関数」について説明していきます
お楽しみに!