PHPでforeach()
などのループ処理中に、不要な値をスキップするcontinue
と、特定の値で処理を終了させるbreak
の使い方をご紹介します。
continue文で特定の値をスキップする
ループ処理中に、配列の中にある不要な値をスキップしたい時があります。
そんな時は条件分岐でcontinue
を使えば、簡単に特定の値をスキップできます。
下記サンプルは$status
配列の中から、つよさ
のパラメーターだけ不要なのでスキップしています。
1 2 3 4 5 6 7 8 9 |
$status = array('なまえ'=>'えにくす', 'せいべつ'=>'おとこ', 'レベル'=>5, 'つよさ'=>20 'HP'=>26, 'MP'=>11,); foreach ($status as $key => $val) { if ($key == 'つよさ') { continue; } else { echo $key.':'.$val.'<br>'; } } |
なまえ:えにくす
せいべつ:おとこ
レベル:5
HP:26
MP:11
上記のように、つよさ
を除いた配列を出力できました。
continue
はループ処理のforeach()
やfor()
while()
で使用可能です。
continueの動作
先ほどのサンプルでは、continue
を以下のように使いました。
- 変数
$status
の配列の中から、キーつよさ
が見つかったらcontinue
に分岐させるif文を作成 - キー
なまえ
〜キーレベル
まではif文の条件に該当しないのでelse
側が発動し、繰り返し出力 - キー
つよさ
がif文の条件に該当するためcontinue
が発動し、処理をスキップ - その次のキー
HP
とMP
はif文の条件に該当しないので、else
側が発動し、繰り返し出力 - 結果、配列のキー
つよさ
を除くキーと値が出力される
配列の中に余計な値が含まれている場合はcontinue
でスキップする方法も覚えておきましょう。
break文でループ処理を終了させる
break
を使うと、配列のループ処理を途中で終了させることができます。
下記サンプルでは、キーつよさ
以降の値を出力させないように、break
で処理を中断させています。
1 2 3 4 5 6 7 8 9 |
$status = array('なまえ'=>'えにくす', 'せいべつ'=>'おとこ', 'レベル'=>5, 'つよさ'=>20, 'HP'=>26, 'MP'=>11); foreach ($status as $key => $val) { if ($key == 'つよさ') { break; } else { echo $key.':'.$val.'<br>'; } } |
なまえ:えにくす
せいべつ:おとこ
レベル:5
上記のように、break
を使うことで処理が中断しました。
break
もcontinue
同様、ループ処理のforeach()
やfor()
while()
で使用可能です。
breakの動作
先ほどのサンプルでは、break
を以下のように使いました。
- 変数
$status
の配列の中から、キーつよさ
が見つかったらbreak
に分岐させるif文を作成 - キー
なまえ
〜キーレベル
まではif文の条件に該当しないのでelse
側が発動し、繰り返し出力 - キー
つよさ
がif文の条件に該当するためbreak
が発動し、処理を終了 - その次のキー
HP
とMP
はif文の条件に該当しないが、break
により処理が中止されたため出力されない - 結果、配列のキー
つよさ
以降のキーと値は無視される
breakでネストのループをコントロール
break
でも複数のネストしたループ処理で、単一のループ処理をスキップするだけでなく、外側のループ処理もまとめてスキップさせることもできます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 |
$members = array('えにくす', 'もよもと', 'こういち'); $status = array('せいべつ'=>'おとこ', 'レベル'=>5,'そうび'=>'ぬののふく'); // 通常の break の場合 foreach ($members as $member) { echo $member.'<br>'; foreach ($status as $key => $val) { if ($key == 'レベル') { break; } else { echo $key.':'.$val.'<br>'; } } } // break 2 の場合 foreach ($members as $member) { echo $member.'<br>'; foreach ($status as $key => $val) { if ($key == 'レベル') { break 2; } else { echo $key.':'.$val.'<br>'; } } } |
break の結果
えにくす
せいべつ:おとこ
もよもと
せいべつ:おとこ
こういち
せいべつ:おとこ
break 2 の結果
えにくす
せいべつ:おとこ
break 2 の方は、えにくす
のみが出力されています。
breakでも2つのサンプルでは下記のように処理が違います。
- break は現在のループ処理のみを対象
- break 2 は現在のループと、その外側のループ処理まで対象
ループのネストが3つの場合は break 3 とbreakの後に任意の数字を付けることで、多重ループでも思うようにコントロールできます。
continueのネストのところ間違ってないです?
お返事が遅くなり申し訳ありません。確かに間違っておりましたので該当箇所を一旦削除いたしました。この度は誤った記述があり申し訳ございません。またご指摘いただきありがとうございます。