84669 person learning
152542 person learning
20005 person learning
5487 person learning
7821 person learning
359900 person learning
3350 person learning
180660 person learning
48569 person learning
18603 person learning
40936 person learning
1549 person learning
1183 person learning
32909 person learning
$arr = array('a', 'b', 'c');$i = 0;foreach($arr as $key => $value) {
if($i == 0) { //第一次就执行了写操作 $arr[$key] = $value . $value; } $i++;
}//$arr的指针被移动了一次,指向第二个元素b上。var_dump(current($arr));//b
为什么一开始指针就到第二个元素去了
ringa_lee
$arr = array('a', 'b', 'c'); $i = 0; foreach($arr as $key => $value) { if($i == 0) { $arr[$key] = $value . $value; } $i++; }
伪代码形同
$arr = array('a', 'b', 'c'); $i = 0; $arrCopy = $arr; //复制出一个待循环数组的副本,接下来都是操作这个副本 $key = currentKey($arrCopy); //将获取到的值分配给$k; $val = currentVal($arrCopy); //将获取到的值分配给$v; //移动副本数组的指针,这边执行顺序比写时复制高,所以先移动 next($arrCopy); $arr = $arrCopy;//将副本赋值回给$arr((主要是将指针同步移动)) { //大括号的内容 if($i == 0) { $arr[$key] = $value . $value; } $i++; } //然后第二次循环 $key = currentKey($arrCopy); $val = currentVal($arrCopy); //移动副本数组的指针,这边执行顺序比写时复制高,所以先移动 next($arrCopy); $arr = $arrCopy;//将副本赋值回给$arr((主要是将指针同步移动)) { //大括号的内容 if($i == 0) { $arr[$key] = $value . $value; } $i++; } //然后第三次循环 $key = currentKey($arrCopy); $val = currentVal($arrCopy); //移动副本数组的指针,这边执行顺序比写时复制高,所以先移动 next($arrCopy); $arr = $arrCopy;//将副本赋值回给$arr((主要是将指针同步移动)) { //大括号的内容 if($i == 0) { $arr[$key] = $value . $value; } $i++; }
$key = currentKey($arrCopy); //将获取到的值分配给$k; $val = currentVal($arrCopy); //将获取到的值分配给$v; next($arrCopy);//移动副本数组的指针 $arr = $arrCopy;//将副本赋值回给$arr((主要是将指针同步移动))
当本次赋值给key和val之后,按照流程指针已经向下移动了一位,所以当执行var_dump(current($arr));时打印false
指针已经向下移动了一位
伪代码形同
当本次赋值给key和val之后,按照流程
指针已经向下移动了一位
,所以当执行var_dump(current($arr));时打印false