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

前端之家收集整理的这篇文章主要介绍了php按数值复制数组元素,而不是引用前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我有以下代码
$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;
}

猜你在找的PHP相关文章