首页 > 解决方案 > PHP:在数组中存储数组似乎是在创建副本

问题描述

这是一个如此基本的问题,但我无法在任何地方找到明确的答案。据我了解,将对象存储在数组中应该存储引用,而不是副本......因此,当您通过数组访问对象时,您随后对对象所做的任何更改都应该是可见的。

在搜索这个主题时,我遇到了很多问题,询问如何将对象的副本存储在数组中,这样就不会发生这种情况,答案总是你需要使用clone. 对我来说,这似乎表明默认情况下会存储参考。

所以当我遇到以下行为时我真的很困惑......

$inner = ['key1'=>"value1"];

$outer = [];
$outer['inner'] = $inner;

$inner['key2'] = "value2";

print_r($inner);
echo "<br>";
print_r($outer['inner']);

输出:

数组 ( [key1] => value1 [key2] => value2 )
数组 ( [key1] => value1 )

两年来,我一直在做相当认真的 PHP 编码,这似乎与我认为我所知道的关于数组的一切背道而驰,所以这真的让我大吃一惊。

Stack Exchange 上的类似问题往往会得到“您应该参考文档”的答案。但是我在文档中找不到任何东西可以清楚地解决这个问题。

标签: phparrays

解决方案


您只是将当时的值分配$inner$outer['inner']. 之后,$outer['inner']是它自己的数组,它不维护对$inner. 这是数组的预期行为。

来自数组的 PHP 文档

数组赋值总是涉及值复制。使用引用运算符通过引用复制数组。

所以如果要维护一个引用,就需要使用引用操作符:

// Set the original values
$inner = ['key1' => 'value1'];

// Assign by reference
$outer = [];
$outer['inner'] = &$inner;

// Modify the original array afterwards
$inner['key2'] = 'value2';

然后,您会发现$outer['inner']保留对 的引用$inner,即使它在分配后已更改。

print_r($inner);
print_r($outer['inner']);

它们将是相同的:

Array ( [key1] => value1 [key2] => value2 )
Array ( [key1] => value1 [key2] => value2 )

注意:使用引用通常不是一个好主意,我不记得曾经真正需要它们。Stack Overflow 上已经对此进行了很好的讨论


推荐阅读