保留需要多次修改的数组的副本/克隆


Keep copy/clone of an array which needs to be modified several times

>我有一个原始数组正在被修改,例如

private function test()
{
    $myArray = array(1,2,3);
    $array = $this->modifyArray($myArray, 1);
}
private function modifyArray($paramArray, $someValue)
{
    foreach ($paramArray as &$item) {
        $item += $someValue;
    }
    return $paramArray;
}

据我了解,$myArray$array将在函数"测试"结束时出现[2,3,4]。

但是,如果我想重新执行此操作并再次调用 modifyArray,正确的方法是什么,如下所示:

private function test()
{
    $myArray = array(1,2,3);
    $array = $this->modifyArray($myArray, 1);
    // new call
    $anotherArray = $this->modifyArray($myArray, 2);
}

据我$myArray的理解,$array$anotherArray现在是[4,5,6]而不是$array= [2,3,4]和$anotherArray = [3,4,5]这是我的意图。

还是我在这里完全被误导了?

你在这里被误导了modifyArray 内部的变量$paramArray仅存在于modifyArray内部,不会进行修改。它只返回更改的数组。这意味着:

$myArray = array(1,2,3); // will still be [1,2,3]
$array = $this->modifyArray($myArray, 1); // $array will be [2,3,4], because [1,2,3] is passed
// new call
$anotherArray = $this->modifyArray($myArray, 2); // $anotherArray will be [3,4,5] because [1,2,3] is passed

如果你想要另一种行为,你应该$paramArray链接到传递的数组,&

private function modifyArray(&$paramArray, $someValue)

现在结果将是:

$myArray = array(1,2,3); // will still be [1,2,3]
$array = $this->modifyArray($myArray, 1); // $array will be [2,3,4], because [1,2,3] is passed and $myArray is now [2,3,4]
// new call
$anotherArray = $this->modifyArray($myArray, 2); // $anotherArray will be [4,5,6] because [2,3,4] is passed and $myArray is now [4,5,6]