1

PHPの特性を比較的よく知っていても、次の奇妙な振る舞いは、今日でも私を混乱させました。

// loose
$a = array(true => 'foo');
var_dump(array_key_exists(1, $a));

// strict
$a = array('7.1' => 'foo');
var_dump(array_key_exists('7.10', $a));

この効果の技術的な理由は何でしょうか。問題は、この関数の背後にあるプロセスで、一部のタイプの値が大まかに比較され、他のタイプの値が厳密に比較される原因は何でしょうか。私はその振る舞いについて不平を言っているわけではありませんが、それを理解しようとしているので、「PHPはダメ」というコメントには意味がありません。

4

4 に答える 4

3

最初のケースでは、ブール値は有効な配列キーではないため、配列を初期化するとすぐに1に変わり、検索が一致します。

2番目のケースでは、配列キーは文字列であり、「7.1」は「7.10」と同じ文字列ではありません

于 2012-08-10T16:45:21.743 に答える
1

2番目の例では、'7.1''7.10'は文字列です。それらは文字列として比較されるため、一致しません。

では、なぜ最初の例で一致するのですか?配列キーは、文字列または整数のいずれかです。したがってtrue、整数に変換され、として評価され1ます。

于 2012-08-10T16:45:52.413 に答える
1

これはここに文書化されています。キーは整数または文字列であることに注意してください。特定のキーキャスト、特に(あなたの場合)boolが整数にキャストされる(つまり、 trueは1、falseは0)とドキュメントに記載されています。他の場所で説明されているように、他の例は文字列です(引用符を削除して浮動小数点数にし、ドキュメントに従って整数に切り捨てられます)。

于 2012-08-10T16:48:32.977 に答える
0

そこにスクリプト出力を追加できますか?一見したところ:配列キーとしてブール値?私はそれがなんらかの形で役立つとは思わない!2番目:7.10は7.1と同じではありません-''でこれを宣言すると文字列になります...。

キー名としてtrueが必要な場合は、一重引用符または二重引用符でカプセル化する必要があります。PHPと一重引用符/二重引用符について知らない場合は、内容がブール値の整数(True / False)ではなく文字列値として扱われるようになります。

于 2012-08-10T16:47:41.277 に答える