php 按值(而不是引用)复制数组元素

2022-08-31 00:54:46

我有以下代码:

$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

我想由于$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;
   }

我离这里很远吗?我不断收到“在非对象上调用__clone方法”错误。从阅读响应来看,我最好的选择似乎是迭代每个元素并克隆它(这就是我试图用该代码做的事情..)。

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

$data['y'][$key] = clone $row;

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


答案 1

您可以利用 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);

结果如下所示:

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 ) 

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

它似乎不是很有效,但如果返回一个数组,它可能会为你工作:$this->x->getResults()

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

有关另一个示例,请参阅此(未回答)线程

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

例:

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

答案 2

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

$clonedArr = (array)clone(object)$arr;

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