通过更改原始数组会影响复制的数组

时间:2015-07-16 18:09:48

标签: php arrays

我对这个奇怪的问题感到震惊。我正在尝试不断向某些$array添加记录,将其复制到$cloned,然后将$cloned传递给batchInsert,这会在设计时添加密钥_id到数组。当我尝试转储原始数组的内容时,我看到了意外的行为,原始数组的内容应该没有$cloned(复制)数组的引用。相反,_id同时出现在$array$cloned中,这非常奇怪,我无法想象发生了什么。

这段代码给了我预期的bahaviour

$array = array();
for($i = 1; $i <= 5; $i++) {
    $array[] = $i;
    $cloned = $array;
    passToFunction($cloned);
    print_r($array); // expecting not to have anything added to that array
}

function passToFunction(&$b) {
    $b["test"] = new Obj();
}

class Obj {
    public $test = "test";
}

结果,正确地,

Array
(
    [0] => 1
)
Array
(
    [0] => 1
    [1] => 2
)
Array
(
    [0] => 1
    [1] => 2
    [2] => 3
)
.
.
.
.

但是,如果我使用MongoDB驱动程序,

$m = new MongoClient();
$db = $m->selectDB("test");
$users = $db->users;

for($i = 1; $i <= 5; $i++) {
        $array[] = array("number" => $i);
        $cloned = $array;
        $users->batchInsert($cloned);
        print_r($array);
}

给我以下输出:

Array
(
    [0] => Array
        (
            [number] => 1
            [_id] => MongoId Object
                (
                    [$id] => 55a7f2bbd04aa45b228b4567
                )

        )

)

注意_id键,它不应该在原始数组中,只是在复制的键中。我错过了什么?

0 个答案:

没有答案