PHPでのフラグの扱い
これから、フラグの扱い方を学びましょう。
フラグとは、trueとfalseの2つの値のみを取ることができる特別な変数です。
フラグを使うことで、何かの欠如を確認するような問題を解決できます:
例えば、特定の値を持つ要素が配列に存在しないことを確認するといったことです。
さあ、始めましょう。
次の問題を解いてみましょう:数値の配列が与えられ、その中に値が3の要素が存在するかどうかを確認する必要があります。
存在する場合は'+++'を出力し、存在しない場合は'---'を出力します。
まずは'+++'を出力することを試みましょう。
そのために、配列のすべての要素をループで走査し、if文を使って現在の要素の値が3と等しいかどうかを確認します。
等しい場合、'+++'を出力します:
<?php
$arr = [1, 2, 3, 4, 5];
foreach ($arr as $elem) {
if ($elem === 3) {
echo '+++';
}
}
?>
しかし、この解決策はあまり良くありません:なぜなら、配列に値が3の要素が一つだけでなく複数ある場合、'+++'が複数回出力されてしまうからです。
配列を修正して(値が3の要素を2つにし)、それを確認してみましょう:
<?php
$arr = [1, 2, 3, 4, 3, 5];
foreach ($arr as $elem) {
if ($elem === 3) {
echo '+++'; // 複数回出力される
}
}
?>
問題を修正しましょう:要素が見つかったらbreakを使ってループを終了させます:
<?php
$arr = [1, 2, 3, 4, 3, 5];
foreach ($arr as $elem) {
if ($elem === 3) {
echo '+++';
break; // ループを終了する
}
}
?>
次に、配列に値が3の要素が全く存在しない場合に、'---'を出力するようにしてみましょう。
よくある誤解は、if文にelseを追加することです。この場合、'---'は3ではないすべての要素に対して出力されてしまいます:
<?php
$arr = [1, 2, 3, 4, 5];
foreach ($arr as $elem) {
if ($elem === 3) {
echo '+++'; // 要素3で出力される
} else {
echo '---'; // 要素1, 2, 4, 5で出力される
}
}
?>
つまり、elseを追加するアイデアは、上手くいかない悪いアイデアです。
この種の問題(このような問題は非常に頻繁に登場します)を解決するために、いわゆるフラグが使用されます。
上記で既に触れたように、フラグはtrueまたはfalseの2つの値のみを取ることができる変数です。
では、変数flagを作成し、次のような意味を持たせましょう:もしそれがtrueなら配列には要素3が存在し、falseならそのような要素は存在しません。
最初に、変数flagの値をfalseに設定します。つまり、配列には要素3が存在しないと想定します:
$arr = [1, 2, 3, 4, 5];
$flag = false; // 配列に要素3は存在しないと考える
その後、以前と同じようにif文を伴うループを実行します。
もしループが配列内に要素3があることを発見したら、変数flagの値をtrueに設定し、breakを使ってループを抜けます:
<?php
$arr = [1, 2, 3, 4, 5];
$flag = false; // 配列に要素3は存在しないと考える
foreach ($arr as $elem) {
if ($elem === 3) {
$flag = true; // 要素が存在する - 変数$flagを再定義
break; // ループを抜ける
}
}
?>
配列に3が存在するかどうかという質問への答えは、ループの後でしか与えられません。
そして、その答えは既に用意されています:ループの後、変数flagはfalseのままか、またはループが配列内に3を発見した場合にその値をtrueに変更しているかのどちらかです:
<?php
$arr = [1, 2, 3, 4, 5];
$flag = false;
foreach ($arr as $elem) {
if ($elem === 3) {
$flag = true;
break;
}
}
// ここで変数$flagはtrueまたはfalseのどちらか
?>
これで、ループの後にif文を作成し、変数flagの値を確認して、画面に'+++'または'---'を出力できます:
<?php
$arr = [1, 2, 3, 4, 5];
$flag = false;
foreach ($arr as $elem) {
if ($elem === 3) {
$flag = true;
break;
}
}
if ($flag === true) {
echo '+++';
} else {
echo '---';
}
?>
次の配列が与えられます:
<?php
$arr = ['a', 'b', 'c', 'd', 'e'];
?>
この配列に要素'c'が存在するかどうかを確認してください。
存在する場合は'+++'を出力し、存在しない場合は'---'を出力してください。
与えられた数値が素数かどうかをチェックするコードを書きなさい。 素数は、1とそれ自身でのみ割り切れ、他の数では割り切れない数です。