PHP foreach()语句的一个诡异问题

现在有一个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”,里面有详细的解释:)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值