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?

More than 1 year has passed since last update.

PHPの制御構造について

Last updated at Posted at 2022-08-21

自己紹介

はじめまして、日本システム開発株式会社の藤井といいます。
業務でPHPを触ることが多く、勉強してみようと思ってドキュメントを読み、役立ちそうな内容を記事にまとめています。
記事の内容は大体php.netに書いてありますが、ドキュメントを読むのが面倒くさいと思った方は、
ぜひこの記事を役立ててください。

概要

PHPの制御構造について、ちょっとしたテクニックを紹介しています。

do-while

do-whileはループ構造であり、breakが使えます。
かつ、絶対に1回は実行されるため、条件によって後の処理を実行しない
といった使い方が可能です。

<?php
$name = "hoge";
do {
    if ($name === "") {
        echo "Hello 名無し";
        break;
    }
    if (mb_strlen($name) > 100) {
        break;
    }

    echo "Hello " . $name;
} while (0);
?>

for

for (式1; 式2; 式3)
式1はループ開始時に無条件で実行、
式2は繰り返しの開始時に実行され、
式3は繰り返しの後に実行されます。

各式では、「,」区切りで複数の式を記述でき、
逆に空にすることもできます。

簡単な例として、

<?php
for (; ; ) {
    echo "piyo";
}
?>

上のスクリプトは無限に実行されます。

「,」区切りでは、

<?php
$hoge = ['h', 'o', 'g', 'e'];

for ($i = 0, $size = count($hoge); $i < $size; $i++) {
    echo $hoge[$i];
}
?>

上のスクリプトのように、countをループ開始時のみで実行し、パフォーマンスを向上させることができます。

foreach

foreachは配列内部のポインタと関係なく動きます。
ポインタを変更することもありません。
(nextなどポインタを操作し、値を取得する関数があります。配列の最後の要素を取得するendは結構便利だと思います)

<?php
$samples = ["hoge", "fuga", "piyo"];
echo next($samples) . PHP_EOL;

foreach ($samples as $idx => $sample) {
    echo $sample;
    if ($idx !== count($samples) - 1)
        echo ",";
    else
        echo PHP_EOL;
}
echo current($samples);
?>

break, continue

ループ構造(for, foreach, while, do-while, switch)の中でのみ使えます。
switch内でcontinueを使用することができますが、breakと同じ挙動で誤解を招きやすい記述のため、推奨されていません。
break, continueには引数を与えることができ、引数の数だけ直近のループ構造から外にでます。
引数のデフォルトは1です。

<?php
for ($i = 0; $i < 10; $i++) {
    echo $i . PHP_EOL;
    for ($j = $i * 10; $j < $i * 10 + 10; $j++) {
        if ($j == $i * 10 + 2)
            break;
        if ($i == 2)
            break 2;
        echo $j . ",";
    }
    echo PHP_EOL . PHP_EOL;
}
?>
上のスクリプトの出力結果
0
0,1,

1
10,11,

2

内側のforは+0-1までで、終了し、
外側のforは+0-2までで、終了します。

まとめ

  • do-whileはループ以外の使い道がある
  • forはパフォーマンスアップなどちょっとした工夫が可能。
  • foreachは内部ポインターとは別で動作する。
  • break, continueには引数を与えられる。
0
0
2

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?