这是有据可查的PHP行为,请参阅php.net的foreach页面上的警告。
警告
即使在 foreach 循环之后,仍保留 $ value的 引用和最后一个数组元素。建议通过unset()销毁它。 __
$a = array('a', 'b', 'c', 'd');foreach ($a as &$v) { }unset($v);foreach ($a as $v) { }print_r($a);
编辑
尝试逐步了解此处实际发生的情况
$a = array('a', 'b', 'c', 'd');foreach ($a as &$v) { } // 1st iteration $v is a reference to $a[0] ('a')foreach ($a as &$v) { } // 2nd iteration $v is a reference to $a[1] ('b')foreach ($a as &$v) { } // 3rd iteration $v is a reference to $a[2] ('c')foreach ($a as &$v) { } // 4th iteration $v is a reference to $a[3] ('d') // At the end of the foreach loop, // $v is still a reference to $a[3] ('d')foreach ($a as $v) { } // 1st iteration $v (still a reference to $a[3]) // is set to a value of $a[0] ('a'). // Because it is a reference to $a[3], // it sets $a[3] to 'a'.foreach ($a as $v) { } // 2nd iteration $v (still a reference to $a[3]) // is set to a value of $a[1] ('b'). // Because it is a reference to $a[3], // it sets $a[3] to 'b'.foreach ($a as $v) { } // 3rd iteration $v (still a reference to $a[3]) // is set to a value of $a[2] ('c'). // Because it is a reference to $a[3], // it sets $a[3] to 'c'.foreach ($a as $v) { } // 4th iteration $v (still a reference to $a[3]) // is set to a value of $a[3] ('c' since // the last iteration). // Because it is a reference to $a[3], // it sets $a[3] to 'c'.
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)