Fragen zur PHP-Foreach-Referenz
typecho
typecho 2017-07-04 13:45:55
0
3
772

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."
"; } //unset($v); foreach ($arr2 as $k => $v){ echo $k." "; echo $v." ".current($arr2)."
"; }

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?

typecho
typecho

Following the voice in heart.

Antworte allen (3)
迷茫

或者你可以这么做:

 &$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
    phpcn_u1582

    补充一点

    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)
      我想大声告诉你

      原因:

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

        Neueste Downloads
        Mehr>
        Web-Effekte
        Quellcode der Website
        Website-Materialien
        Frontend-Vorlage
        Über uns Haftungsausschluss Sitemap
        Chinesische PHP-Website:Online-PHP-Schulung für das Gemeinwohl,Helfen Sie PHP-Lernenden, sich schnell weiterzuentwickeln!