【发布时间】:2013-10-31 08:42:11
【问题描述】:
假设我声明了一个数组:
$data = array( 'foo' => 'bar' );
现在我将添加对自身的引用作为新元素:
$data['baz'] = &$data;
转储$data 的内容会导致:
Array
(
[foo] => bar
[baz] => Array
(
[foo] => bar
[baz] => Array
*RECURSION*
)
)
现在,我可以转储$data['baz']['baz']['baz']['baz']['baz']['baz']['baz']['baz']['baz'] 的内容,结果将与上面完全相同,因为数组有一个指向自身作为元素的指针。
我想知道的是 php 是否将数组作为一组数据处理,其指针与我在使用 $data 时调用的指针完全相同,或者它是否做一些完全不同的事情。
另外,PHP 在返回$data{['baz']*n} 的内容时会耗尽内存吗?
【问题讨论】:
-
实际上,要理解这一点,您需要了解 PHP 数组是什么。它们不是列表或类似的东西,它们是散列,简而言之。所以 PHP 存储了一个引用,它是键。问题是在“递归”数组中,这样的引用指向它是另一个元素,仅此而已(即它仍然是一个引用,仅此而已)。而且 - 不,如果您在每次迭代时重新分配元素,您将不会出现内存溢出
-
就像一个循环链表。它仅将内存用于单个循环,而不是用于所有副本的无限内存。
-
数组没有“列”,列是您在将数组元素呈现为表格时选择的解释方式。
-
@meagar 这是真的。另外 - 虽然我对此有正确的想法,但我会等待能够以更正式和限制性的方式解释这一点的人:)
标签: php arrays recursion reference