现在有一个PHP脚本:
<?php
$array = array(1, 2, 3, 4);
foreach ($array as $key => $value) {
$value = &$array[$key];
echo current($array);
}
// 最后输出2233
执行上面这个脚本,如注释所说,最终会输出2233这个结果,有木有觉得很诡异?为什么会是这个结果呢?
首先,要理解这个问题,我们得先将循环拆解,然后看看数组的值会怎么变化:
1) 第一次循环
$value = $array[0];
$value = &$array[0]; // $value现在变成了$array[0]的引用了
这时的$array = array(1, 2, 3, 4);
2) 第二次循环
$value = $array[1]; // 由于$value引用$array[0],此语句相当于$array[0] = $array[1],也就是$array[0] = 2
$value = &$array[1]; // $value现在变成了$array[1]的引用了
这时的$array = array(2, 2, 3, 4);
3) 第三次循环
$value = $array[2]; // 由于$value引用$array[1],此语句相当于$array[1] = $array[2],也就是$array[1] = 3
$value = &$array[2]; // $value现在变成了$array[2]的引用了
这时的$array = array(2, 3, 3, 4);
4) 第四次循环
$value = $array[3]; // 由于$value引用$array[2],此语句相当于$array[2] = $array[3],也就是$array[2] = 4
$value = &$array[3]; // $value现在变成了$array[3]的引用了
这时的$array = array(2, 3, 4, 4);
现在我们来看一下脚本为什么会输出2233,我们可以试一下在foreach内部使用key($array)来看看它的返回值是什么,然后你会发现key()函数返回的值都是1,也就是说,数组的指针永远都是指向下标为1的元素,所以在每次循环中,current($array)函数的返回值也永远是下标为1的元素的值。
最后,我们来看看每次循环中,数组下标为1的元素的值是什么?是的,就是下面图中的这些:
至于,为什么key()函数的返回值永远都是1呢,大家可以参考这个网址中的“问题2”,里面有详细的解释:)