素材牛VIP会员
有关php foreach 引用的问题
 马***1  分类:PHP代码  人气:945  回帖:3  发布于6年前 收藏

foreach使用&对数组arr2遍历之后,再次对数组遍历,得到的结果很困惑,不知哪位大神能说下&遍历指针是怎么移动的呢。
代码如下:

    $arr2 = ['a','s','d'];
    foreach ($arr2 as $k => &$v){
        echo $k." ".$v."<br>";
    }
    //unset($v);
    foreach ($arr2 as $k => $v){
        echo $k." ";
        echo $v." ".current($arr2)."<br>";
    }

结果:
0 a
1 s
2 d
0 a a
1 s a
2 s a

为什么第二次遍历的时候指针移动到s就停止了呢

 标签:php

讨论这个帖子(3)垃圾回帖将一律封号处理……

Lv5 码农
Am***ze JS工程师 6年前#1

补充一点

foreach()循环对数组内部指针不再起作用,在PHP7之前,当数组通过foreach迭代时,数组指针会移动。
    现在开始,不再如此,见下面代码。。
$array = [0, 1, 2];
foreach ($array as &$val) 
{
var_dump(current($array));
}
PHP5运行的结果会打印int(1) int(2) bool(false)
PHP7运行的结果会打印三次int(0),也就是说数组的内部指针并没有改变。
之前运行的结果会打印int(1), int(2)和bool(false)
Lv4 码徒
ji***ca JS工程师 6年前#2

或者你可以这么做:

<?php

$arr2 = ['a','s','d'];

foreach ($arr2 as $k => &$v){
    echo $k." ".$v.PHP_EOL;
}

while(current($arr2)) {
    echo key($arr2).'->'.current($arr2).PHP_EOL;
    next($arr2);
}

输出:

0 a
1 s
2 d
0->a
1->s
2->d
Lv1 新人
非***扰 交互设计师 6年前#3

原因:

  • 在第一次的foreach中采取了引用传递的方式,第一次循环$v指向$arr2[0]的存储空间,第二次指向> $arr2[1]的存储空间,循环结束则指向$arr2[2]的存储空间;

  • 在第二次的foreach中采取了值传递的方式,第一次循环给$v赋值了a,即给$arr2[2]赋值了a,第二次同上,$arr2[2]的值变为了$arr2[1]的值,则$arr2变成了[a,s,s],所以是数组的最后一个元素变成了倒数第二个元素的值

解决办法:

  • 在第一个foreach结束后加一句unset($v);

  • 第二次foreach循环不用$v换个其他名字的变量

参考:

  • php中用foreach改变数组的值的问题

  • php 数组 类对象 值传递 引用传递 区别

 文明上网,理性发言!   😉 阿里云幸运券,戳我领取