将数组副本传递给需要引用的函数

时间:2018-10-25 09:37:56

标签: php parameter-passing pass-by-reference

我有以下类型的循环:

foreach ($values as $key => $value) {
    $attrs = array('NAME' => $key);
    myproc ($attrs);
    ......
}

myproc中,第一个参数由引用定义:

function myproc (& attrs) {  .... }

myproc将传递的值添加到某些结构中。

麻烦的是,在循环结束时,添加到生成的结构中的所有数组都包含相同的值,即从循环中提取的最后一个值。

我也尝试过这样的事情:

foreach ($values as $key => $value) {
    $attrs = array('NAME' => $key);
    $copy = $attrs;
    myproc ($copy);
    ......
}

,但结果相同。我不允许修改程序。有什么建议吗?

2 个答案:

答案 0 :(得分:1)

根据问题下方的注释,似乎问题在于您正在传递引用,并且该引用在循环中得到更新,从而导致函数中正在生成的对象发生更新。

为避免这种情况,您需要在函数调用后取消设置变量,以便断开对象中的值与引用的变量之间的链接:

AAATable.Last().acol.ToString()

另请参阅the manual

答案 1 :(得分:0)

<?php

foreach(['red','pink','green'] as $colour) {
    $attrs = ['colour' => $colour];
    if(colourToAction($attrs)) {
        $results[] = $attrs;
    }
}

var_export($results);

function colourToAction(&$attrs) {
$actions = ['red'=>'stop','amber'=>'wait', 'green' => 'go'];
if(isset($attrs['colour']) && isset($actions[$attrs['colour']])){
    $attrs['action'] = $actions[$attrs['colour']];
    return true;
}
}

输出:

array (
  0 => 
  array (
    'colour' => 'red',
    'action' => 'stop',
  ),
  1 => 
  array (
    'colour' => 'green',
    'action' => 'go',
  ),
)