编程语言
首页 > 编程语言> > php-老实说,我不知道如何制定这个通过引用的难题

php-老实说,我不知道如何制定这个通过引用的难题

作者:互联网

所以这是我看到的这段代码在做的事情:

>制作一个数组
>循环重复10次

>创建一个新的数组
>对这个新数组的引用保存在第一个数组中

> 10个数组现在驻留在原始数组中,其值分别为0、1、2、3 …

实际发生的情况:

> WTF?

码:

<?php

header('Content-type: text/plain');

$arrays = array();

foreach(range(0, 10) as $i)
{
    $arr = array();
    $arr[0] = $i;

    $arrays[] = &$arr;
}

print_r($arrays);

输出:

Array
(
    [0] => Array
        (
            [0] => 10
        )

    [1] => Array
        (
            [0] => 10
        )

    [2] => Array
        (
            [0] => 10
        )

    [3] => Array
        (
            [0] => 10
        )

    [4] => Array
        (
            [0] => 10
        )

    [5] => Array
        (
            [0] => 10
        )

    [6] => Array
        (
            [0] => 10
        )

    [7] => Array
        (
            [0] => 10
        )

    [8] => Array
        (
            [0] => 10
        )

    [9] => Array
        (
            [0] => 10
        )

    [10] => Array
        (
            [0] => 10
        )

)

我想确切地知道为什么显然只有第十个数组被引用了十次,而不是每个数组实例都被引用了一次.

另外,如果像我这样不只是在想WTF的人想编辑标题,请随时这样做.

解决方法:

线

$arr = array();

不会创建新数组,而是将一个空数组分配给已经存在的引用.
如果希望变量名“指向”内存中的另一个数组,则必须先对其进行unset()(或“ disconnect”),然后再为其分配一个空数组:

foreach(range(0, 10) as $i)
{
    unset($arr);
    $arr = array();
    $arr[0] = $i;

    $arrays[] = &$arr;
}

这是因为唯一可以使变量指向其他内容的操作是引用赋值(=&)和unset().

标签:pass-by-reference,arrays,php
来源: https://codeday.me/bug/20191201/2081686.html