我正在测试数据副本上的引用的性能/故障。我有以下代码:
function ScoreWords($Value){
$WordList = array(
"Amazing" => 1,
"Value" => 300,
"Elements" => 30,
"Another" => 0
);
if (array_key_exists($Value,$WordList)){
return $WordList[$Value];
}
}
$array = ["Value","Another",1,2,3,4];
echo implode(',', $array), "<br>";
foreach ($array as &$value) {
ScoreWords($value);
}
echo implode(',', $array), "<br>";
foreach ($array as $value) {
ScoreWords($value);
}
echo implode(',', $array), "<br>";
但似乎上面粘贴的代码半精细。输出是:
值,另一个,1,2,3,4-
值,另一个,1,2,3,4-
值,另一个,1,2,3,3-
我发现这是错误的,因为爆炸实际上并不是必需的,但这引发了一个问题。为什么最终打印的重复值而不是4
的正确值?无论数组的内容是什么。它似乎将最后一个元素中的第二个元素复制为最后一个元素?
答案 0 :(得分:3)
发生的事情是,在您的第一个foreach
之后,$value
是对数组中最后一个元素的引用。随着循环的进行,它是对每个元素的引用,直到最后停止在最后一个元素。
因此,当第二个foreach
运行时,$value
仍然是引用。当该循环运行时,它会更新$value
,而unset($value);
会更新数组中的最后一个元素。
当它到达最后一个元素时,它从前一个循环迭代设置为3。所以,这就是它最后设置为3的原因。
要在第一次foreach
之后{{1}}解决此问题。
答案 1 :(得分:1)
这里的事情是,当你通过引用传递它时,你必须unset
值:
foreach ($array as &$value) {
ScoreWords($value);
}
unset($value); // break the reference with the last element
警告 $ value的引用和最后一个数组元素保持均匀 在foreach循环之后。建议通过unset()来销毁它。