2

私のコードには次のものがありました:

$mixed = array();
$mixed[0] = "It's a zero!";
$mixed['word'] = "It's a word!";   

foreach ($mixed as $key => $value) {
  if ($key == 'word') {             
    echo $value.'<br />';
  } 
}

上記は、何らかの理由で「それはゼロです!」の両方を印刷します。と「それは言葉です!」。「一言!」だけ印刷されると思っていました。何故ですか??重要なものが欠けているような気がします。ifステートメントで使用===していたときは、期待どおりに機能しました。つまり、「It'saword!」のみが出力されました。等しい演算子と同一の演算子には違いがあることは知っていますが、最初の例は等しくありませんか?

4

4 に答える 4

5

==比較の前に型変換を行います。

==整数を使用してを実行すると、適切な整数値0に変換されます。'word'

intval()純粋な文字列が指定された場合は0を返すため、0が一致します。もう1つは文字列コンテキストで一致し、それも一致しました。


===そのような暗黙の変換を行わないため、文字列が実際に同一である場合にのみtrueが返されます。

于 2012-11-13T17:46:20.783 に答える
1

PHP変数にはタイプがあります。

==同じタイプに変換した後、等しい===かどうかをチェックし、タイプもチェックします。var_dump実際のタイプが何であるかを確認するために使用します。

于 2012-11-13T17:45:26.367 に答える
1

上記の@Cthulhuの回答を参照してください。これは非常に明確です。

それとは別に、ここに別の例があります。 strpos()関数は、needlefromの位置を返しますhaystack

<?php
 $pos_a = strpos('apple', 'a'); // a is in the first position.
 $pos_b = strpos('apple', 'b'); // there is no b.
 if ($pos_a){
    echo 'we got a!'."\n";
 }
 if  ($pos_b){
    echo 'we got b!'."\n";
 }

strposFALSE針が見つからない場合は戻ります。しかし、phpはechoステートメントを実行しないことがわかります。

var_dumo()これらの2つの値を実行すると、それが表示され、と$pos_a$pos_b含まれ0ますFALSE

if===を使用しない限り、両方が考慮されるため0、ステートメントは失敗しましたFALSEFALSE

今これを試してみてください:

 <?php
 $pos_a = strpos('apple', 'a'); // a is in the first position.
 $pos_b = strpos('apple', 'b'); // there is no b.
 if ($pos_a !== FALSE){
    echo 'we got a!'."\n";
 }
 if  ($pos_b !== FALSE){
    echo 'we got b!'."\n";
 }

これで、「we got a!」とエコーするので、目的の結果が表示されます。

于 2012-11-13T17:58:21.833 に答える
0

$ a == $b型ジャグリング後に$aが$bと等しい場合、TRUEになります。$ a === $ b $aが$bと等しく、同じタイプの場合はTRUEと同じです。

それはそのように見えます

==の文字列に対して0をチェックすると、PHPはtrueを返します。

php -r'var_dump(0 == "statuses");' ->TRUEを返します

ただし、文字列の先頭に数字がある場合はそうではありません。

php -r'var_dump(0 == "2statuses");' ->FALSEを返します

仕様から、変換を試みることがわかりました。この場合は、文字列から数値への変換です。

だからより良い使用===

http://php.net/manual/en/language.operators.comparison.php

于 2012-11-13T17:52:00.943 に答える