【问题标题】:PHP Strange behaviour with recursive arrays递归数组的 PHP 奇怪行为
【发布时间】:2013-07-23 03:15:15
【问题描述】:
$array = array();
$array[ 'recursive' ] =& $array;

$array[ 'foo' ] = $array;

'foo' 被赋值给$array,它应该复制$array,它当时没有'foo' 键,所以我预计现在的情况是这样的:

$array = array(
    'recursive' => &$array,
    'foo'       => array(
        'recursive' => &$array
    ),
)

但如果我现在这样做:

var_dump( isset( $array[ 'foo' ][ 'foo' ][ 'foo' ] ) );

我明白了:

bool(true)

我不明白这是为什么。

如果我为'foo'的赋值创建一个中间变量,像这样:

$array = array();
$array[ 'recursive' ] =& $array;

$blah = $array;
$array[ 'foo' ] = $blah;

var_dump( isset( $array[ 'foo' ][ 'foo' ][ 'foo' ] ) );

我明白了:

bool(false)

我明白为什么 'recursive' 键会无限深,因为它是通过引用分配的,但为什么 'foo' 键是按值分配的?为值处理的事物创建中间变量如何改变行为?

【问题讨论】:

  • 这可能与此有关:stackoverflow.com/questions/17528280/…,看看你能不能弄清楚。现在对我来说太晚了。 :)
  • 根据您链接到的答案,我试图想象代码执行时符号表的外观,但我只达到了我预期的行为,而不是我看到的行为。

标签: php arrays recursion reference


【解决方案1】:

因为当您执行 $array['foo'] = $array 时,解释器首先将 'foo' 索引添加到 $array 值,然后将新更新的数组放入 $array['foo']。

当您使用中间 $blah 时,您已经存储了在创建 'foo' 键之前未修改的 $array 副本。中间体不会改变行为,它会在创建中间体时存储值的副本,就像它应该做的那样。

【讨论】:

  • 那为什么$a = array(); $a['foo'] = $a;不产生递归呢?
  • @Jesse 只是想问同样的问题 :)。我认为这是错误的说法。我们需要查看 PHP 源代码。
猜你喜欢
  • 1970-01-01
  • 2016-11-06
  • 2016-11-07
  • 1970-01-01
  • 2015-01-31
  • 1970-01-01
  • 2019-04-11
  • 2017-05-23
  • 2020-11-11
相关资源
最近更新 更多