2

重複の可能性:
存在しない配列キーに対して true を返す isset() の奇妙な動作

$arr = array(
         'application' => array (
            'environment' => 'development',
            'mode_debug' => 1,
            'key' => '123456abcdefg',
            'debug_soft' =>
            'firephp',
            'aaa' => array (
                'bbb' => '111',
                'ccc' => '222',
                'ddd' => array (
                    'eee' => '12345',
                ),
            ),
        ),
        'database' => array (
            'host' => 'localhost',
            'database' => '',
            'username' => '',
            'password' => '',
            'charset' => 'utf8',
            'prefix' => '',
        ),
    );


if(isset($arr["application"]["aaa"]["ddd"]["eee"]['out']) && !empty($arr["application"]["aaa"]["ddd"]["eee"]['out'])){
    echo "a";
    echo '<br />';
    var_dump($arr["application"]["aaa"]["ddd"]["eee"]['out']);
}else{
    echo "b";
}

戻り値:

a
string(1) "1" 

しかし、'$arr' 配列には 'out' インデックスがないのに、'string(1) "1"' を返すのはなぜですか?

マニュアルは、1 つの次元配列のみをサンプリングするため、役に立ちません。

$a = array ('test' => 1, 'hello' => NULL);

var_dump( isset ($a['test']) );            // TRUE
var_dump( isset ($a['foo']) );             // FALSE
var_dump( isset ($a['hello']) );           // FALSE
4

3 に答える 3

7

このことを考慮:

$str = 'test';
var_dump(isset($str['xxx'])); // true

次の理由により、true が返されます。

  • PHP は$str[$n]構文をサポートしています (文字列の個々の文字に対処するため)

  • インデックスを計算するときは、整数型にキャストされます

  • 整数にキャストする場合"xxx"0; アクセスしている$str[0]- その文字列の最初の文字で$strあり、( t) は真の値です。

issetのこの (非常に奇妙な) 動作は、PHP 5.4 で修正されたことに注意してください。

5.4.0 : 文字列の数値以外のオフセットをチェックすると、FALSE が返されるようになりました。

于 2012-11-08T14:33:00.350 に答える
2

これは、eeeインデックスに値の文字列が含まれているためです。文字列は配列としてアクセスできます。文字列でインデックスを使用すると、 の整数値にoutキャストされ、に等しい が得られます。out0$arr["application"]["aaa"]["ddd"]["eee"][0]1

これを防ぐには、次を使用しis_array()ます。

if (is_array($arr["application"]["aaa"]["ddd"]["eee"]) && isset($arr["application"]["aaa"]["ddd"]["eee"]['out'])) {
于 2012-11-08T14:33:29.220 に答える
1

$ arr ["application"] ["aaa"] ["ddd"]["eee"]値"12345"の最初の文字「1」を返すようです。キー「out」は存在しません。

于 2012-11-08T14:35:43.913 に答える