我有以下代码:
$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;
它的工作原理感谢大家的帮助.
您可以利用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 )
您可以看到在将$arr分配到$arr2期间使用array_flip()的结果导致后续更改为$arr2的差异,因为array_flip()调用强制执行取消引用.
它看起来不是很有效率,但是如果$this-> x-> getResults()返回一个数组,它可能会有效:
$data['x'] = array_flip(array_flip($this->x->getResults())); $data['y'] = $data['x'];
参见this (unanswered) thread另一个例子.
如果返回的数组中的所有内容都是一个对象,那么复制对象的唯一方法是使用clone(),并且您必须遍历$data [‘x’]并将每个元素克隆到$data [‘y “].
例:
$data['x'] = $this->x->getResults(); $data['y'] = array(); foreach($data['x'] as $key => $obj) { $data['y'][$key] = clone $obj; }