php按值复制数组元素,而不是通过引用

oym*_*oym 13 php arrays pointers codeigniter

我有以下代码:

$data['x'] = $this->x->getResults();  

$data['y'] = $data['x'];

//some code here to modify $data['y']
//this causes (undesirably) $data['x] to be modified as well
Run Code Online (Sandbox Code Playgroud)

我猜因为$ data的所有元素都是引用,修改$ data ['y']也会修改$ data ['x'] ..这不是我想要的.我希望$ data ['x']保持不变.有没有办法取消引用这里的元素,以便我可以按值复制元素?

谢谢.

更新:$ this-> x-> getResults(); 返回一个对象数组.所以我可以做类似的事情:$ data ['x'] [0] - > date_create ...

更新:我最近克隆数组的尝试看起来像这样:

   $data['x'] = $this->x->getResults();     
   $data['y'] = $data['y'];
   foreach($data['x'] as $key=>$row) {
       $data['y'][$key]->some_attr = clone $row->some_attr;
   }
Run Code Online (Sandbox Code Playgroud)

我离开这里了吗?我一直得到一个"非对象调用的__clone方法"错误.从阅读响应看来,我最好的选择是迭代每个元素并克隆它(这是我试图用该代码做的事情......).

更新:刚刚解决了!:在foreach循环中我只需要将行更改为:

$data['y'][$key] = clone $row;
Run Code Online (Sandbox Code Playgroud)

它的工作原理!感谢大家的帮助.

zom*_*bat 10

您可以利用PHP将取消引用函数调用的结果这一事实.

这是我掀起的一些示例代码:

$x = 'x';
$y = 'y';
$arr = array(&$x,&$y);
print_r($arr);

echo "<br/>";
$arr2 = $arr;
$arr2[0] = 'zzz';
print_r($arr);
print_r($arr2);

echo "<br/>";
$arr2 = array_flip(array_flip($arr));
$arr2[0] = '123';
print_r($arr);
print_r($arr2);
Run Code Online (Sandbox Code Playgroud)

结果如下所示:

Array ( [0] => x [1] => y )
Array ( [0] => zzz [1] => y ) Array ( [0] => zzz [1] => y )
Array ( [0] => zzz [1] => y ) Array ( [0] => 123 [1] => y ) 

您可以看到,在分配array_flip()期间使用的结果$arr$arr2导致后续更改中的差异$arr2,因为array_flip()调用会强制取消引用.

它看起来效率不高,但如果$this->x->getResults()返回一个数组,它可能对你有用:

$data['x'] = array_flip(array_flip($this->x->getResults()));
$data['y'] = $data['x'];
Run Code Online (Sandbox Code Playgroud)

请参阅此(未答复的)线程以获取另一个示例.

但是,如果返回数组中的所有内容都是对象,则复制对象的唯一方法是使用clone(),并且必须迭代$data['x']并克隆每个元素$data['y'].

例:

$data['x'] = $this->x->getResults();
$data['y'] = array();
foreach($data['x'] as $key => $obj) {
    $data['y'][$key] = clone $obj;
}
Run Code Online (Sandbox Code Playgroud)


Ale*_*sov 10

array_merge()可以接受任意数量的参数,甚至1个,然后产生一个新数组。所以只需执行以下操作:

$new_array = array_merge($existing_array);
Run Code Online (Sandbox Code Playgroud)


小智 5

array_flip()当数组值不是字符串或整数时,将不起作用.然而,我找到了一个简单的解决方案

$clonedArr = (array)clone(object)$arr;
Run Code Online (Sandbox Code Playgroud)

这要归功于对象上克隆的属性.

  • 这是行不通的。如果`$ arr`中有参考变量,则新数组仍将包含它们。引用在克隆中存活。 (4认同)