有關php foreach 引用的問題
typecho
typecho 2017-07-04 13:45:55
0
3
861

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就停止了呢

typecho
typecho

Following the voice in heart.

全部回覆(3)
迷茫

或你可以這麼做:

<?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
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]值了第二次同上,$arr2[2]的值變為了$arr2[1]的值,則$arr2變成了[a,s,s],所以是數組的最後一個元素變成了倒數第二個元素的值

解決方法:

    在第一個
  • foreach

    結束後加一句unset($v);

  • 第二次
  • foreach

    循環不用$v換個其他名字的變數

參考:

    php中用foreach改變數組的值的問題
  • php 陣列 類別物件 值傳遞 引用傳遞 區別
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板