1

私は午前中ずっとphpin_array()関数で苦労しました。最終的には修正できましたが、設定によって問題が修正された理由について少し混乱しています。

変数$typeを文字列値(正確には'forum')に設定し、$all_typesを次のような配列に設定します。

$ all_types:

[protocol2] => protocol2
[group] => 0
[post] => 0
[forum] => 0
[article] => 0
[page] => 0
[protocol1] => 0

そして、私は持っていました:

if (in_array($type,$all_types) !== FALSE) {
  "Do stuff..."
}

そして、「何かをする...」が起こり続けました。最初は、配列の「フォーラム」キーがヒットしたためだと思ったので、配列を次のように変更してみました。

[0] => protocol2
[1] => 0
[2] => 0
[3] => 0
[4] => 0
[5] => 0
[6] => 0

しかし、それでも機能しませんでした。最後に、STRICT変数をTRUEに設定すると、元の配列でも正常に機能しているようです。

では、これはなぜですか?STRICT = TRUEは、干し草の山の針と値が同じタイプである必要があることを意味しますが、一致する場合は両方の文字列ではありませんか?そして、彼らが「フォーラム」を0と比較しないとき、それは何らかの理由で一致しますか?

4

3 に答える 3

4

タイプジャグリング用です。'STRICT'をFALSEとして使用する場合、in_arrayは'=='演算子を使用して値を比較します。そして、あなたが知っている、var_dump('string' == 0);本当です。

したがって、配列にさまざまなタイプの値がある場合は、厳密な比較と比較することをお勧めします。

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

于 2012-07-20T09:51:29.537 に答える
0

$ typeの値を変更すると、これは期待どおりに機能します。あなたがあなたの質問で暗示しているように、型ジャグリングは予期しないことを起こすので、厳密に固執してください。

<?php
$type      = 'forum';
$all_types = array(
    'protocol2' => 'forum',
    'group' => 0,
    'post' => 0,
    '1' => '0',
    'article' => 0,
    'page' => 0,
    'protocol1' => 0
);

if (in_array($type, $all_types, TRUE)) {
    echo "Here";
} else {
    echo "Not Here";
}
于 2012-07-20T09:50:19.667 に答える
-2

値ではなく配列キーをテストしているため、array_key_existsを使用する必要があるようです(これはin_arrayが行うことです)。

于 2012-07-20T09:46:17.533 に答える