自己紹介
はじめまして、日本システム開発株式会社の藤井といいます。
業務で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には引数を与えられる。