阵列克隆的性能

时间:2009-04-01 22:13:56

标签: php performance arrays

我们都知道

$a1 = array('foo');
$a2 = $a1;
$a2[0] = 'bar';
// now $a1[0] is foo, and $a2[0] is bar. The array is copied

但是,我记得读过但无法通过Googling确认的是,在修改之前,数组在内部不会被复制。

$a1 = array('foo');
$a2 = $a1; // <-- this should make a copy
// but $a1 and $a2 point to the same data internally
$a2[0] = 'bar';
// now $a1[0] is foo, and $a2[0] is bar. The array is really copied

我想知道这是否属实。如果是这样,那就好了。它可以在大量传递大量数据时提高性能,但无论如何只能读取它(在创建一次之后)。

3 个答案:

答案 0 :(得分:5)

这可能比您想知道的要多,但this article很好地描述了变量在PHP中的工作方式。

一般来说,你是正确的,在绝对必要之前不会复制变量。

答案 1 :(得分:1)

我似乎证实了这一点:

<?php

ini_set('memory_limit', '64M');

function ttime($m) {
    global $s;
    echo $m.': '.(microtime(true) - $s).'<br/>';
    $s = microtime(true);
}

function aa($a) {
    return $a;
}

$s = microtime(true);
for ($i = 0; $i < 200000; $i++) {
    $array[] = $i;
}
ttime('Create');
$array2 = aa($array); // or $array2 = $array
ttime('Copy');
$array2[1238] = 'test';
ttime('Modify');

给出:

Create: 0.0956180095673
Copy: 7.15255737305E-6
Modify: 0.0480329990387

答案 2 :(得分:0)

我相信你在这里是对的。我将尝试找到关于此的文档...我找不到任何关于此的内容,但我确信我在某处读到了它。希望有人在这里找到文档会有更好的运气。