数组上的奇怪打印

时间:2014-07-03 17:26:06

标签: php arrays

我正在测试数据副本上的引用的性能/故障。我有以下代码:

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的正确值?无论数组的内容是什么。它似乎将最后一个元素中的第二个元素复制为最后一个元素?

2 个答案:

答案 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()来销毁它。

Foreach reference