加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长学院 > PHP教程 > 正文

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

发布时间:2020-12-13 16:35:42 所属栏目: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’]也会修改$da
我有以下代码:
$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;
}

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读