0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

【PHP初心者向け】for文の中で実行した関数内の処理によってループを終了させる

Posted at

※プログラミング初学者なので内容に誤りを含む場合があります。

初歩的な知識であると思われるが、検索しても意外と見つけづらかったので残しておく。

例題として、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など真偽値を返す関数があることを考えれば当然といえば当然なのだが、自分で作るとなるとちょっと苦労したのでメモ。

0
0
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?