重复数组但保持指针链接

时间:2010-03-24 15:04:44

标签: php arrays pointers

假设我有一个节点(对象)数组。我需要创建一个我可以修改的数组副本,而不会影响源数组。但是更改节点会影响源节点。基本上保持指向对象的指针而不是复制它们的值。

// node(x, y)
$array[0] = new node(15, 10);
$array[1] = new node(30, -10);
$array[2] = new node(-2, 49);

// Some sort of copy system
$array2 = $array;

// Just to show modification to the array doesn't affect the source array
array_pop($array2);
if (count($array) == count($array2))
  echo "Fail";    

// Changing the node value should affect the source array
$array2[0]->x = 30;
if ($array2[0]->x == $array[0]->x)
   echo "Goal";

最好的方法是什么?

2 个答案:

答案 0 :(得分:2)

如果您使用PHP 5:

你运行过你的代码吗? 它已经在运行,无需更改任何内容。我明白了:

Goal

我跑的时候。

这很可能是因为$array的值已经是引用。

另请阅读this question。虽然他想要实现相反的目标,但理解数组复制如何在PHP中工作可能会有所帮助。

<强>更新

这种行为,在使用对象复制数组时,将复制对象的引用,而不是对象本身was reported as a bug。但是还没有关于此的新信息。


如果您使用PHP 4:

为什么还要使用它?

您必须执行以下操作:

$array2 = array();

for($i = 0; $i<count($array); $i++) {
    $array2[$i] = &$array[$i];
}

答案 1 :(得分:0)

现在是时候我不会编写PHP代码,而是编写代码

// Some sort of copy system
$array2 = $array;

实际上有效吗?

您是否必须以新的方式复制数组的每个元素?