suchen

Heim  >  Fragen und Antworten  >  Hauptteil

Fragen zur PHP-Foreach-Referenz

Nachdem foreach & verwendet, um das Array arr2 zu durchlaufen, ist das Ergebnis sehr verwirrend. Ich frage mich, ob irgendein Experte erklären kann, wie sich der &-Traversalzeiger bewegt.
Der Code lautet wie folgt:

    $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>";
    }

Ergebnis:
0 a
1 s
2 d
0 a a
1 s a
2 s a

Warum blieb der Zeiger stehen, als er sich beim zweiten Durchlauf auf s bewegte?

typechotypecho2698 Tage vor840

Antworte allen(3)Ich werde antworten

  • 迷茫

    迷茫2017-07-04 13:47:55

    或者你可以这么做:

    <?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

    Antwort
    0
  • phpcn_u1582

    phpcn_u15822017-07-04 13:47:55

    补充一点

    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)

    Antwort
    0
  • 我想大声告诉你

    我想大声告诉你2017-07-04 13:47:55

    原因:

    • 在第一次的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 数组 类对象 值传递 引用传递 区别

    Antwort
    0
  • StornierenAntwort