首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >PHP引用数组的深层副本

PHP引用数组的深层副本
EN

Stack Overflow用户
提问于 2009-05-21 19:56:53
回答 2查看 8.9K关注 0票数 17

所以$array是一个所有元素都是引用的数组。

我想将这个数组附加到另一个名为$results的数组中(在循环中),但因为它们是引用,所以PHP复制引用,而$results充满了相同的元素。

到目前为止,最好的解决方案是:

代码语言:javascript
复制
$results[] = unserialize(serialize($array));

我担心这是非常低效的。有没有更好的方法来做这件事?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2009-05-21 20:16:08

您可以利用函数在返回时取消对结果的引用这一事实,例如,在这里,$array_by_myclone将仍然引用$original ($array_by_myclone[0][0] == 'foo'),而$array_by_assignment将具有克隆值($array_by_assignment[0][0] == 'bar')。

代码语言:javascript
复制
$original = 'foo';
$array_of_reference = array(&$original);

function myclone($value)
{
  return $value;
}

$array_by_myclone = array();
$array_by_myclone[] = array_map('myclone', $array_of_reference);

$array_by_assignment = array();
$array_by_assignment[] = $array_of_reference;

$original = 'bar';

var_dump($array_by_myclone[0][0]); // foo, values were cloned                                                                                                                                   
var_dump($array_by_assignment[0][0]); // bar, still a reference                     

编辑:我想检查说unserialize(serialize())更快的评论是否正确,所以我用php5.5做了测试,结果证明这是错误的:使用序列化方法即使是在小数据集的情况下也会更慢,而且你拥有的数据越多,它就会变得越慢。

代码语言:javascript
复制
lepidosteus@server:~$ php -v
PHP 5.5.1-1~dotdeb.1 (cli) (built: Aug  3 2013 22:19:30) 
Copyright (c) 1997-2013 The PHP Group
Zend Engine v2.5.0, Copyright (c) 1998-2013 Zend Technologies
    with Zend OPcache v7.0.2-dev, Copyright (c) 1999-2013, by Zend Technologies
lepidosteus@server:~$ php reference.php 1
myclone:   0.000010 seconds
serialize: 0.000012 seconds
lepidosteus@server:~$ php reference.php 1000000
myclone:   0.398540 seconds
serialize: 0.706631 seconds

使用的代码:

代码语言:javascript
复制
<?php
$iterations = 1000000;
if (isset($argv[1]) && is_numeric($argv[1])) {
  $iterations = max(1, (int)$argv[1]);
}

$items = array();
for ($i = 0; $i < $iterations; $i++) {
  $items[] = 'item number '.$i;
}

$array_of_refs = array();
foreach ($items as $k => $v) {
  $array_of_refs[] = &$items[$k];
}

function myclone($value)
{
  return $value;
}

$start = microtime(true);

$copy = array_map('myclone', $array_of_refs);

$time = microtime(true) - $start;

printf("%-10s %2.6f seconds\n", 'myclone:', $time);

$start = microtime(true);

$copy = unserialize(serialize($array_of_refs));

$time = microtime(true) - $start;

printf("%-10s %2.6f seconds\n", 'serialize:', $time);
票数 9
EN

Stack Overflow用户

发布于 2016-01-06 11:52:14

不需要将array_map与serialize进行比较,因为array_map没有用处。

代码语言:javascript
复制
$original = array('key'=>'foo');
$array_of_reference = array(&$original);
function myclone($value)
{
  return $value;
}
$array_by_myclone = array();
$array_by_myclone[] = array_map('myclone', $array_of_reference);

$array_by_assignment = array();
$array_by_assignment[] = $array_of_reference;

$original['key'] = 'bar';

var_dump($array_by_myclone[0][0]['key']); // bar, still a reference                                                                                                                                   
var_dump($array_by_assignment[0][0]['key']); // bar, still a reference   

array_map将回调应用于给定数组的元素,就像foreach一样。如果要复制的数组具有多个嵌套,则array_map不起作用。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/894814

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档