PHP使用递归数组的奇怪行为

时间:2013-07-23 20:37:37

标签: php arrays recursion reference

$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'密钥会无限深,因为它是通过引用分配的,但为什么{{1}}密钥是按值分配的?如何为值处理的事物创建中间变量更改行为?

1 个答案:

答案 0 :(得分:0)

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

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