※プログラミング初学者なので内容に誤りを含む場合があります。
初歩的な知識であると思われるが、検索しても意外と見つけづらかったので残しておく。
例題として、1~10までの数字を生成する処理を無限ループさせ、1が2回連続出ればループを終了させるコードを考えてみる。
error.php
for ($i = 0;; $i++) {
echo $i + 1 . '回目の挑戦です。' . PHP_EOL;
$num1 = rand(1, 10);
if ($num1 === 1) {
echo '1回目の1です!' . PHP_EOL;
stop();
} else {
echo '1回目は1が出ませんでした。続きます。' . PHP_EOL;
}
}
function stop()
{
$num2 = rand(1, 10);
if ($num2 === 1) {
echo '2回目の1です。お見事。終了します。' . PHP_EOL;
break;
} else {
echo '2回目は1が出ませんでした。惜しい。続きます。' . PHP_EOL;
}
}
上記のようにすると
PHP Fatal error: 'break' not in the 'loop' or 'switch' context
このように怒られてしまうのでどうにかする必要がある。正解は以下のようにif文の条件の中で関数を実行し、真偽値を返す方法である。
correct.php
for ($i = 0;; $i++) {
echo $i + 1 . '回目の挑戦です。' . PHP_EOL;
$num1 = rand(1, 10);
if ($num1 === 1) {
echo '1回目の1です!' . PHP_EOL;
if (stop()) {
break;
}
} else {
echo '1回目は1が出ませんでした。続きます。' . PHP_EOL;
}
}
function stop(): bool
{
$num2 = rand(1, 10);
if ($num2 === 1) {
echo '2回目の1です。お見事。終了します。' . PHP_EOL;
return true;
} else {
echo '2回目は1が出ませんでした。惜しい。続きます。' . PHP_EOL;
return false;
}
}
やってみれば全然難しい処理ではないし、in_arrayなど真偽値を返す関数があることを考えれば当然といえば当然なのだが、自分で作るとなるとちょっと苦労したのでメモ。