首页 > 解决方案 > 通过引用 php

问题描述

所以我正在学习按引用传递,我不明白的是,我需要在函数上使用按引用传递吗?像这样

$items = [1,2,3,4,5];
function my_func(&$items) {
    $items[] = 6;
}

    
my_func($items);
var_dump($items);

它会输出

array(6) { [0]=> int(1) [1]=> int(2) [2]=> int(3) [3]=> int(4) [4]=> int(5) [5]=> int(6) }

我见过人们像这样通过引用向数组添加值

class play {
    public function test() {

        $items = [1,2,3,4,5];

        foreach($items as &$item) {
            $item[] = 6;
        }

        return $items;
    }
}

$play = new play;
$play->test();

然后我得到警告:

不能将标量值用作数组

循环中有没有办法通过函数外部的引用来添加值?

标签: php

解决方案


看来你误解了代码在做什么......

你有一个数组...

$array = [1,2,3,4,5,6];

...可以重写为...

$array = [
    0 => 1,
    1 => 2,
    2 => 3,
    3 => 4,
    4 => 5,
    5 => 6,
];

// Hint: try print_r($array);

...左边keys的数字是 ,右边的数字是values

您的循环一次循环遍历数组一行

foreach ($array as $item) {
    echo $item;
}

// Output: 123456

现在,如果您添加“按引用传递”运算符,那么您可以编辑$item;的值 例如,我们可以将数组中的每个项目1转换为...

foreach ($array as &$item) {
    $item = 1;
}

print_r($array);

/* Output:

Array
(
    [0] => 1
    [1] => 1
    [2] => 1
    [3] => 1
    [4] => 1
    [5] => 1
)

*/

如果没有&前面$item的代码,只会改变循环$item内部的值。foreach原始数组不会被触及。

您收到错误的原因是因为您正在分配一个值,$item就好像它是一个数组一样。实际上,$item变量是整数。因此,要使其正常工作,您需要做的就是删除[]分配行中的 :

$item[] = 6;

// Becomes...

$item = 6;

如果您想要添加一个值而不是替换一个值,那么您可以这样做。但是您需要向数组中添加一个值,它不是$items $item

$items[] = 6;

当然,在循环中执行此操作将为数组中的每个项目添加一次值......


推荐阅读