可能重复:
Strange behavior with isset() returning true for an Array Key that does NOT exist
$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”'?
手册没有帮助,因为它只采样一个维度阵列:
$a = array ('test' => 1, 'hello' => NULL);
var_dump( isset ($a['test']) ); // TRUE
var_dump( isset ($a['foo']) ); // FALSE
var_dump( isset ($a['hello']) ); // FALSE
答案 0 :(得分: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。
答案 1 :(得分:2)
这样做是因为您的eee
索引包含值的字符串 - 并且字符串可以作为数组进行访问。当您在字符串中使用索引out
时,它会将out
转换为整数值0
,为您提供$arr["application"]["aaa"]["ddd"]["eee"][0]
,等于1
。
您可以使用is_array()
if (is_array($arr["application"]["aaa"]["ddd"]["eee"]) && isset($arr["application"]["aaa"]["ddd"]["eee"]['out'])) {
答案 2 :(得分:1)
似乎返回$ arr [“application”]的第一个字符'1'[“aaa”] [“ddd”] [“eee”]值“12345”甚至键'out'不存在。< / p>