【问题标题】:Duplicate array but maintain pointer links重复数组但保持指针链接
【发布时间】:2010-03-24 15:04:43
【问题描述】:

假设我有一个节点(对象)数组。我需要创建这个数组的副本,我可以在不影响源数组的情况下对其进行修改。但是更改节点会影响源节点。基本上维护指向对象的指针而不是复制它们的值。

// 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";

最好的方法是什么?

【问题讨论】:

  • 我不明白。当您希望在更改重复数组中的值时更新源数组时,如何修改数组而不影响源数组?你能举个例子说明你在做什么吗?
  • 我认为他的意思是重复的数组应该具有对与第一个数组相同的实例的引用,但它本身独立于数组。因此,更改第二个数组的内容不会修改第一个数组,但更改第二个数组引用的类中的某些参数将修改第一个数组引用的同一实例。
  • @Kjir:啊哈,我现在明白了 :)
  • @Kjir:哦,那我下面的回答正好相反哈哈。
  • @prodigitalson:那你应该删除它。

标签: php arrays pointers


【解决方案1】:

如果您使用 PHP 5:

您是否运行过您的代码? 它已经在工作了,不需要改变任何东西。我明白了:

Goal

当我运行它时。

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

另请阅读this question。尽管他的 OP 想要实现相反的效果,但了解数组复制在 PHP 中的工作原理可能会有所帮助。

更新:

这种行为,当复制带有对象的数组时,对象的引用被复制而不是对象本身,was reported as a bug。但目前还没有这方面的新信息。


如果您使用 PHP 4:

(你为什么还用它?)

你必须这样做:

$array2 = array();

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

【讨论】:

  • 啊,我实际上并没有测试代码。我期待不得不使用copy 或类似的东西。谢谢(你的)信息。在传递函数时这是如何工作的?
  • @StJohn Johnson:传递函数是什么意思?作为参数传递给函数的对象?这也应该通过引用传递(在 PHP 5 中)。另请参阅:devzone.zend.com/article/1714
【解决方案2】:

有段时间我不写 PHP 代码,但会写代码

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

真的有用吗?

您不必将数组的每个元素复制到一个新元素中吗?

【讨论】:

  • 不,您不必复制每个元素。文档说:数组赋值总是涉及值复制。 php.net/manual/en/language.types.array.php
  • 你是对的......在我的回答中,我在考虑如何保留指针而不是对象的副本......
猜你喜欢
  • 2019-02-13
  • 2017-09-14
  • 2021-11-09
  • 2019-04-07
  • 1970-01-01
  • 2012-11-17
  • 1970-01-01
  • 1970-01-01
  • 2021-11-08
相关资源
最近更新 更多