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)
这要归功于对象上克隆的属性.