任何人都可以解释为什么是真的
$a = Array('b' = > 'okokokok');
if ( isset( $a['b']['ok'] ) ) {
echo $a['b']['ok']; // Print 0
} else {
echo "else";
}
答案 0 :(得分:5)
这是为了向后兼容PHP 4(参见PHP Bug #29883)。将字符串转换为整数,并且字符串不是有效整数时,它变为0(零)。打印字母“o”,因为它是字符串中偏移0处的字符。
在PHP 5.4中,行为有意改变(见PHP Bug #60362); PHP版本改为打印“else”。
答案 1 :(得分:2)
首先,它不打印'0',而是小写'o'。 试试这个:
$string = 'abc';
echo $string['omgwhysuchkeyworks'];
它将打印'a'。这是因为当你在字符串变量上尝试任何键(除了数字)之前它似乎在PHP中它将返回字符串的第一个字符。这也是isset($a['b']['ok'])
返回true的原因。
这可能是PHP版本的问题。也许在较新的版本上它会按预期工作(它会写'else')
答案 2 :(得分:1)
答案 3 :(得分:1)
$a = Array('b' = > 'okokokok');
if ( isset( $a['b']['ok'] ) ) {
echo $a['b']['ok']; // Print 0
} else {
echo "else";
}
如果您有字符串,则可以将其视为数组。它的索引是数字的,从零开始到字符串长度减去1。但是,如果您尝试将字符串作为索引传递(在这种情况下为 ok ),PHP会尝试将其转换为整数,将其计算为零(intval('ok')
)。在使用php 5.4的系统上,它处理不同并检查密钥本身并且不进行转换。因此,在一个系统中它可以打印else
而在另一个系统中它打印o
。