我有以下类型的循环:
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);
......
}
,但结果相同。我不允许修改程序。有什么建议吗?
答案 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',
),
)