1

当按值传递给函数时,我一直在修改数组时遇到问题。

我检查了代码,在函数内部,数组循环通过引用获取元素。

我惊讶地发现,在循环之后,数组项被标记为引用。我不知道这意味着什么,但一定是我的问题的根源。

让我举一个例子来说明这一点。

<?php
error_reporting(E_ALL);
ini_set('display_errors' , 1);

$a = array( array(0) );
echo '--1--';var_dump($a);
dummy($a);
echo '--4--';var_dump($a);

function dummy($arg) {
    foreach($arg as &$item) {
        $item[0] = 3;
    }    
    dummy2($arg);
echo '--3--';var_dump($arg);
}

function dummy2($arg) {
    foreach($arg as &$item) {
        $item[1]=9;
    }
echo '--2--';var_dump($arg);
}
?>

在这段代码之后,我希望在第 3 点中,$arg 只有一个元素,但它有两个,因此它已被 dummy2 函数修改。

输出如下:

--1--array(1) { [0]=> array(1) { [0]=> int(0) } } 
--2--array(1) { [0]=> &array(2) { [0]=> int(3) [1]=> int(9) } } 
--3--array(1) { [0]=> &array(2) { [0]=> int(3) [1]=> int(9) } } 
--4--array(1) { [0]=> array(1) { [0]=> int(0) } }

为什么数组被引用循环后标记为&array?如何避免这种情况?

4

2 回答 2

2

您需要取消设置通过引用捕获的循环变量:

<?php
error_reporting(E_ALL);
ini_set('display_errors' , 1);

$a = array( array(0) );
echo '--1--';var_dump($a);
dummy($a);
echo '--4--';var_dump($a);

function dummy($arg) {
    foreach($arg as &$item) {
        $item[0] = 3;
    }
    unset($item);
    dummy2($arg);
echo '--3--';var_dump($arg);
}

function dummy2($arg) {
    foreach($arg as &$item) {
        $item[1]=9;
    }
    unset($item);
echo '--2--';var_dump($arg);
}
?>

请参阅foreach 的文档,有一个很大的红色警告说:

即使在 foreach 循环之后,对 $value 和最后一个数组元素的引用仍然存在。建议通过 unset() 将其销毁。

于 2012-06-13T04:42:26.850 回答
0

使用key => value对并在函数中返回数组

<?php

    error_reporting(E_ALL);
    ini_set('display_errors' , 1);

    $a = array( array(0) );

    echo '--1--';var_dump($a);

    $a = dummy($a);

    echo '--4--';var_dump($a);

    function dummy($arg) {

        foreach($arg as $key => $value) {

            $arg[$key][0] = 3;
        }

        return dummy2($arg);
    }

    function dummy2($arg) {

        foreach($arg as $key => $value) {

           $arg[$key][1]=9;
        }

        return $arg;
    }
?>

http://codepad.org/f30c6FUj

于 2012-06-12T21:41:37.273 回答