PHP:它是动态的东西还是其他任何东西

时间:2013-08-30 09:28:01

标签: php arrays isset

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

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

4 个答案:

答案 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)

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

Array
(
    [b] => okokokok
)

请参阅http://ideone.com/50EhGW

答案 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