PHP の for ループで double equals が機能しないのはなぜですか? 以下の作品:
$cnt = 5;
for ($z = 0; $z <= $cnt; $z++) {
echo $z."!<br />";
}
しかし、なぜこれが機能しないのでしょうか。
$cnt = 5;
for ($z = 0; $z == $cnt; $z++) {
echo $z."!<br />";
}
ループは、条件が と評価された場合にのみ実行されtrue
ます。最初の反復で$z == $cnt
は はfalse
であるため、ループは実行されません。
一般的なループ戦略は、センチネル値を使用することです:
$cnt = 5;
$stop = $cnt + 1;
for ($z = 0; $z != $stop; $z++) {
. . .
}
比較は負 (!=
または!==
) であることに注意してください。センチネルの使用は通常、数値ループ変数には不要ですが (投稿されたコードにはお勧めしません)、他の状況 (たとえば、 を$stop
表すときnull
、不正な値など) には便利です。簡潔に特徴付けるのが容易ではないパターンでループ変数が変化する場合に特に役立ちます。
最初の反復$z != $cnt
であるため、ループはすぐに停止します。
の構文for
は次のとおりです。
for (<init>; <condition>; <increment>)
<condition>
ループは各反復の前にテストします。の場合true
、その反復を実行します。の場合false
、ループは終了します。
あなたの場合、最初の反復の前であるため$z == $cnt
、false
ループはすぐに終了します。
必要なことを行うには、テストを反転します。<=
また、元のバージョンではではなく が使用されていたため、最終値を 1 つ上げる必要があります<
。$cnt+1
どちらの場合も、 0 から開始するため、ループが実行されることに注意してください。
for ($z = 0; $z != $cnt+1; $z++)
これをコンピュータの観点から見てみましょう。
もし私がコンピュータなら、これはあなたが私にそうするように言ったことです:
問題は、5 が 0 に等しくならないことです。したがって、ループは単純にスキップされます。ループ内に $cnt = $z+1 がある場合、これは無限ループになります。
つまり、== は問題なく機能しますが、本来すべきと考えていることを単純に実行しません。
お役に立てれば!