4

というわけで、今日も毎日のようにプログラミングをしていました。いつもの仕事に沿って、タイピングし、Daft Punk やその他のさまざまなグルーヴィーな曲を聴きます。それから突然、次の行に沿って何かを書かなければなりませんでした:

$x = 'a'; // For instance

if ($x == 'a' || $x == 'b') {
    // ...
}

私が言うには、あまりにも粗末ではなく、十分にシンプルです。ちょっと待って!私は自分自身に考えました"there must be an easier way to do that - I'm repeating myself"。そこで、次のコードでこれを解決しようと試みました。

if ($x == ('a' || 'b')) { 
    // ...
}

しかし、それはうまくいきません。まったく。それは常に真実です。が、、または$xに等しい場合。だから私は不機嫌になり、少し泣いて、誰かが理由を知っているかどうかをStackoverflowに尋ねることにしました。abccake

ありがとう!

4

7 に答える 7

2

||は論理和であり、左側をブール値 ( 'a'、ブール値のコンテキストにあるtrue) として評価し、それが true の場合は true を返し、そうでない場合は右側に対して同じことを行います。

var_dump('a' || 'b');
bool(true)

ここで、この値は文字と比較されます。これは、PHP のクレイジーなルール (緩い比較チャート)に基づいて、これも真になります。

var_dump('a' == true);
bool(true)
于 2012-07-30T18:32:00.480 に答える
1

$xがの値に等しいかどうかを評価するようにPHPに要求しています。これは、「a」と「b」の両方の値がゼロ以外であるため、('a' OR 'b')常に返されます。true

この場合、比較演算子を個別に使用するか、コメントからのnickbの提案を使用する必要があります。

于 2012-07-30T18:29:45.863 に答える
1

それはうまくいきませんでした

$a = 'a' || 'b'; // true, since 'a' and 'b' considered truthy

この場合、文字列リテラルはブール値に変換されます。

そして$x、ifが空の文字列または偽物と見なされる他の文字列でない場合、それらは等しくなります。

ただし、次のように記述できます。

if (in_array($x, array('a', 'b', 'cake'))

あなたがそれがあなたの意図をより明確にすると感じるならば。

于 2012-07-30T18:31:54.967 に答える
1

|| ご存じのとおり || は論理演算子であり、常に true または false (つまり、1 または 0) を返します。したがって、コード ('a' || 'b') は常に true(1) を返します。上記の場合、$x には値が含まれているため、自動型変換により $x も true(1) に設定されるため、if(1 == 1) となり、常に true を返します。

以下のコードで試してください

$x = false;
if ($x == ('a' || 'b')) { echo 'true'; } else{ echo 'false';}

常に false を返します。

于 2012-07-30T18:52:15.947 に答える
1

私はするだろう:

$valid = array('a', 'b');

if (in_array($x, $valid)) {
    ...
}

簡単です!

...しかし、振り返ってみると、おそらく別の方法でそれを行う必要はありませんでしたか?

于 2012-07-30T18:32:49.397 に答える
0

PHP が文字列をブール値に変換する方法を確認する

php > var_dump((bool) "a");
bool(true)
php > var_dump((bool) "b");
bool(true)
php > var_dump((bool) "cake");
bool(true)

だから基本的にあなたはphp if($x == true)を尋ねます

于 2012-07-30T18:32:05.543 に答える
0

http://php.net/manual/en/types.comparisons.phpを参照してください

于 2012-07-30T18:32:17.777 に答える