Php 当数组中没有这样的索引时,为什么返回字符串值?

Php 当数组中没有这样的索引时,为什么返回字符串值?,php,string,Php,String,可能重复: 但是“$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['hel

可能重复:

但是“$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
考虑这一点:

$str = 'test';
var_dump(isset($str['xxx'])); // true
它返回true,因为:

  • PHP支持
    $str[$n]
    语法(用于处理字符串的各个字符)

  • 计算索引时,将其转换为整数类型

  • 当转换为整数时,
    “xxx”
    0
    ;您正在访问
    $str[0]
    -该
    $str
    字符串的第一个字符,它(
    t
    )是一个真实值

请注意,的这种(相当奇怪的)行为在PHP 5.4中得到了修复:

5.4.0:检查字符串的非数字偏移量现在返回FALSE


之所以这样做,是因为
eee
索引包含一个值字符串,而字符串可以作为数组访问。当您在字符串中使用索引
out
时,它将
out
转换为
0
的整数值,给您
$arr[“application”][“aaa”][“ddd”][“eee”][0]
,等于
1

您可以使用
is\u array()
来防止这种情况:


它似乎返回$arr[“application”][“aaa”][“ddd”][“eee”]value“12345”的第一个字符“1”,甚至连key“out”都不存在。

哇,这对我来说是全新的。我想,这是因为“out”被转换为“0”。我们应该记住的是,
isset()
不是豁免,也不是PHPs动态键入的解决方法。@mario感谢您的通知,问题可能是duplicated@user1063434:请注意,重复链接是超链接的首要条件,不会降低您的问题的趣味性或有效性。请参阅,
isset
非常方便,因为它很早就失败了,也就是说,如果这个
['aaa']['bbb']['ccc']
偏移量中的任何一个不可访问,它只会返回
FALSE
。使用
is_数组并不太好:你必须确保最后两个偏移量确实存在。@raina77ow是的,你可以使用
isset($var['aaa']['bbb']['ccc'])
然后
is_数组($var['aaa']['bbb']['ccc']['xxx'])
;在OP的例子中,
isset()
true
——他只需要验证它是否是一个数组,然后再将其作为数组处理。
$a = array ('test' => 1, 'hello' => NULL);

var_dump( isset ($a['test']) );            // TRUE
var_dump( isset ($a['foo']) );             // FALSE
var_dump( isset ($a['hello']) );           // FALSE
$str = 'test';
var_dump(isset($str['xxx'])); // true
if (is_array($arr["application"]["aaa"]["ddd"]["eee"]) && isset($arr["application"]["aaa"]["ddd"]["eee"]['out'])) {