相关疑难解决方法(0)

PHP数组引用的深层副本

所以$ array是一个数组,其中所有元素都是引用.

我想将这个数组追加到另一个名为$ results的数组(在循环中),但由于它们是引用,PHP复制引用,$ results充满了相同的元素.

到目前为止,最佳工作解决方案是:

$results[] = unserialize(serialize($array));
Run Code Online (Sandbox Code Playgroud)

我担心这会非常低效.有一个更好的方法吗?

php deep-copy

17
推荐指数
1
解决办法
8578
查看次数

你能用值显式复制包含"引用"元素的PHP数组吗?

关于PHP数组元素的引用的背景

假设您使用嵌套的PHP数组创建一个复杂的数据结构,如下所示:

$a1 = array(
    'b' => array('foo' => 1),
    'c' => array('bar' => 1)
);
Run Code Online (Sandbox Code Playgroud)

想象一下,数组要更加嵌套,具有更多元素和更长,更有意义的名称.

如果需要经常访问$ a1的子结构,对于读写,可能会想要创建这样的"别名":

$b = &$a1['b'];
Run Code Online (Sandbox Code Playgroud)

然而,由于"任务"实际上改变了$ a1,这导致了巨大的混乱.

我认为许多缺乏经验的PHP开发人员(比如我)会认为$ b是在分配后对$ a1 ['b']的引用.真正发生的是$ b AND $ a1 ['b']变成对元素的引用array('foo' => 1),带来意想不到的后果.我发现这非常不直观.

假设您需要保留$ a1,但是您还需要$ a1的副本,让我们调用副本$ a2,并更改$ a2的一些元素:

$a2 = $a1;           // Copy $a1 to $a2
$a2['b']['foo'] = 2; // GOTCHA! This will change $a1['b']['foo'] as well!
$a2['c']['bar'] = 2; // This will not change $a1['c']['bar'] however
Run Code Online (Sandbox Code Playgroud)

因为我们之前创建了对$ a1 ['b']的引用,所以该元素将通过引用分配,而$ a1的其余部分按值复制.这花了我几个小时才弄明白. …

php arrays reference

7
推荐指数
1
解决办法
175
查看次数

PHP解引用数组元素

我有2个阵列.

$result = array();
$row = array();
Run Code Online (Sandbox Code Playgroud)

Row的元素都是引用,并且不断变化.对于每次迭代,$row我想将行的复制到条目$result而不是引用.

我找到了一些解决方案,但它们看起来都很糟糕.

$result[] = unserialize(serialize($row));
$result[] = array_flip(array_flip($row));
Run Code Online (Sandbox Code Playgroud)

上面的两个工作,但似乎是很多不必要和丑陋的代码只是通过值复制引用数组的内容,而不是复制引用本身.

有没有更清洁的方法来实现这一目标?如果不是最有效的方式是什么?

谢谢.

编辑:如下所示,例如:

function dereference($ref) {
    $dref = array();

    foreach ($ref as $key => $value) {
        $dref[$key] = $value;
    }

    return $dref;
}

$result[] = dereference($row);
Run Code Online (Sandbox Code Playgroud)

也有效,但看起来同样丑陋.

php arrays reference dereference

6
推荐指数
1
解决办法
5276
查看次数

标签 统计

php ×3

arrays ×2

reference ×2

deep-copy ×1

dereference ×1