2

任何人都可以解释为什么它是真的

  $a = Array('b' = > 'okokokok');
  if ( isset( $a['b']['ok'] ) ) {
      echo $a['b']['ok']; // Print 0
  } else {
      echo "else";
  }
4

4 回答 4

5

这是为了向后兼容 PHP 4(参见PHP Bug #29883)。将字符串转换为整数时,如果字符串不是有效整数,则变为 0(零)。打印字母“o”是因为它是字符串中偏移量 0 处的字符。

在 PHP 5.4 中,有意改变了行为(参见PHP Bug #60362);该 PHP 版本改为打印“else”。

于 2013-08-30T09:35:21.453 回答
2

首先,它不打印'0',而是小写'o'。尝试这个:

$string = 'abc';
echo $string['omgwhysuchkeyworks'];

它将打印'a'。这是因为在 PHP 中,当您在字符串变量上尝试任何键(数字除外)时,它似乎会返回字符串的第一个字符。这也是isset($a['b']['ok'])返回 true 的原因。

这可能是PHP版本的问题。也许在较新的版本上它会按预期工作(它会写'else')

于 2013-08-30T09:34:16.207 回答
1

它打印else'ok'不是数组索引,而是数组索引上的'b'$a

Array
(
    [b] => okokokok
)

http://ideone.com/50EhGW

于 2013-08-30T09:31:49.360 回答
1
$a = Array('b' = > 'okokokok');
  if ( isset( $a['b']['ok'] ) ) {
      echo $a['b']['ok']; // Print 0
  } else {
      echo "else";
  }

当你有一个字符串时,你可以把它当作数组。它的索引是数字的,从零开始到字符串长度减一。但是,如果您尝试将字符串作为索引传递(这种情况下可以),PHP 会尝试将其转换为整数,并将其评估为零(intval('ok'))。在使用 php 5.4 的系统上,它会以不同的方式处理并检查密钥本身并且不进行转换。因此,在一个系统中它可能会打印else,而在另一个系统中它会打印o

于 2013-08-30T09:41:41.597 回答