@ PHP

繰り返し処理

条件分岐とな並んでよく利用されるのが、繰り返し処理(構造化プログラミングの反復)です。

PHP では、while / do‥‥while、for / foreach などの命令文が提供されています。

繰り返し処理概念図

for文

for文は、繰り返し処理を効率よく行うための制御構文(制御構造)です。
一般的には、カウンターを用意してその値によって何回繰り返すかを決めます。

format

for ( 式1 ; 式2 ; 式3 ) {
    // 繰り返し実行する処理
}

3つの式を組み合わせて条件式を記述し、それぞれの式は「 ; 」で区切る

式1:カウンター変数の初期化式
式2:繰り返し継続条件式
式3:増減式

もう少し具体的にすると

for ( 式1:カウンター変数の初期化式 ; 式2:繰り返し継続条件式 ; 式3:増減式 ) {
    // 条件式が TRUE の間、繰り返し実行する処理
}

基本的な構文

for_01.php

<?php
for ($i = 1; $i <= 10; $i++) {
    echo $i;
}
?>

break 文を使ってループを抜ける-1

for ( 式1 ; 空 ; 式3 ) {
    // 繰り返し実行する処理
} 

式2を空にすると無限実行ループになるので、
条件付き break 文を使って、条件式が true になるまでループ処理を繰り返し、
条件式が false になるとループを終了します。

for_02.php

<?php
for ($i=1; ; $i++) {
    if($i > 10) {
        break;
    }
    echo $i;
}
?>

break 文を使ってループを抜ける-2

変数に初期値を代入
for( 空 ; 空 ; 空 ){
    // 繰り返し実行する処理
}

式を空にすると無限実行ループになります。
条件付き break 文を使って、条件式が true になるまでループ処理を繰り返し、
条件式が false になるとループを終了します。

for_03.php

<?php
$i = 1;
for (; ; ) {
    if ($i > 10) {
        break;
    }
    echo $i;
    $i++;
}
?>

continue文

ループそのものを完全に抜けてしまう break 文に対して、現在の周回だけをスキップし、ループそのものは継続して実行するのが、continue 文です。

for_04.php

<?php
for ($i = 1; $i <= 10; $i ++) {
    if (($i % 2) != 0) {
        continue;
    }
    echo $i;
}
?>

for 文の入れ子(ネスト)

for 文の中に for 文をいれる(ネスト)ことができます。

for_05.php

<?php
for ($i = 1; $i <= 3; $i ++) {
    echo '<p>';
    for ($j = 1; $j <= 3; $j ++) {
        echo $i . '-';
        echo $j . ' ';
    }
    echo '</p>';
}
?>

カンマ演算子

カンマ演算子を利用することで、初期化式、繰り返し継続条件式、増減式に複数の式を指定することができます。

for ( 式1,式1 ; 式2,式2 ; 式3,式3 )

for_06.php

<?php
for ($i = 1, $j = 0; $i <= 10; $j += $i, print $j, $i++);
?>

中カッコを使わないfor文

中カッコを使わず、:(コロン)と endfor を使った for 文があります。

for ( 式1 ; 式2 ; 式3 ):
    // 繰り返し実行する処理
endfor;

for_07.php

<?php
for ($i = 1; $i <= 10; $i++):
    echo $i;
endfor;
?>

while文

while文は、ある条件が成立しているあいだだけ、処理を繰り返し実行する制御文です。
for文と異なるのは、カウンターにあたるものがないことです。主に繰り返す回数がわからないときに使います。

while 文の基本的な構文

while ( 式 ) {
    // 条件式が TRUE の間、繰り返し実行する処理
}
<?php
// 初期値「0」のカウンター変数「$i」の値が「10」以下の間「$i」を「1」づつ加算処理しながらループする。
$i = 0;
while ($i <= 10) {
    echo $i++; /* 出力される値は、足される前の $i の値 */
}
?>

do‥‥while文

do‥‥while文は、while文と同じように繰り返し処理を行う制御文です。

do {
    // 条件式が TRUE の間、繰り返し実行する処理
} while ( 条件式 )

while文では条件が先にあるので、最初の回で条件が成立しなければ処理を1度も実行しませんが、
do‥‥while文では条件を下に書くため、必ず1度は処理を実行します。

while_01.php

<?php
//初期値「0」のカウンター変数「$x」の値が「1」以上なおかつ「10」未満の間ブロックの中の文を繰り返し実行する
$x = 0;
do {
    echo $x;
    $x++;
} while ($x >= 1 && $x < 10);
?>

中カッコを使わないwhile文

while ( 条件式 ):
    // 条件式が TRUE の間、繰り返し実行する処理
endwhile; 

while_02.php

<?php
$i = 0;
while ($i <= 10) :
    echo $i;
    $i++;
endwhile;
?>

foreach文

foreach文は、配列の要素の数だけ処理を繰り返します。

foreachの基本構文

foreach (配列 as 要素の[値]用変数) {
    // ループ内で実行する処理
}

foreach_01.php

<?php
// $dataに配列の要素を最初から順に代入し、要素がなくなるまで処理を繰り返します。
$data = array (1, 2, 3, 4, 5);
foreach ($data as $value){
    echo "要素 $value <br>";
}
?>

foreachの拡張型の構文

foreach (配列 as 要素の[添え字]用変数 => 要素の[値]用変数) {
    // ループ内で実行する処理
}

拡張形では、配列のインデックスも取得することができます。

foreach_02.php

<?php
$data = [ 1, 2, 3, 4, 5 ];
foreach ($data as $key => $value) {
    echo "$key => $value <br>";
}
?>

連想配列の場合

連想配列でも同様です。

foreach_03.php

<?php
$data = [ "a" => "1","b" => "2","c" => "3","d" => "4","e" => "5" ];
foreach ($data as $key => $value) {
    echo "$key => $value <br>";
}
?>