+ -
当前位置:首页 → 问答吧 → 求解:数组引用 foreach 、 array_splice()

求解:数组引用 foreach 、 array_splice()

时间:2011-12-05

来源:互联网

PHP code

$a = array(1,2,3,4,5,6,7);
$a2 = &$a; //引用

foreach($a2 as $index =>$item){
    echo "===outer start,index= $index ====<br />";
    echo "\$a[",$index,'] =>',$item,"<br />";
    echo 'count($a)=',count($a2).'<br />';
    
    foreach ($a2 as $i => $val) {
        echo "----inner start---   key=".$i."   ----";

        if($val==5){
            echo "<br />";
            array_splice($a2,$i,1);    
            //unset($a2[$i]);        
            echo 'array_splice($a,'.$i.',1),$val='.$val.' <br />';
            echo 'count($a)=',count($a2).'<br />';
        }

        echo "----inner end----<br />";

    }
    
    echo "\$a[",$index,'] =>',$item,"<br />";
    echo 'count($a)=',count($a).'<br />';
    echo "====outer end, index= $index  ====<br />";
}

print_r($a);



执行结果 ,为何$a2使用引用方式时, 在内层foreach 中的 array_splice()之后,不再执行外面的foreach
HTML code

===outer start,index= 0 ====
$a[0] =>1
count($a)=7
----inner start--- key=0 --------inner end----
----inner start--- key=1 --------inner end----
----inner start--- key=2 --------inner end----
----inner start--- key=3 --------inner end----
----inner start--- key=4 ----
array_splice($a,4,1),$val=5
count($a)=6
----inner end----
----inner start--- key=0 --------inner end----
----inner start--- key=1 --------inner end----
----inner start--- key=2 --------inner end----
----inner start--- key=3 --------inner end----
----inner start--- key=4 --------inner end----
----inner start--- key=5 --------inner end----
$a[0] =>1
count($a)=6
====outer end, index= 0 ====
Array ( [0] => 1 [1] => 2 [2] => 3 [3] => 4 [4] => 6 [5] => 7 ) 



作者: abiao5555   发布时间: 2011-12-05

因为你的 array_splice 破坏了传给 foreach 的数组结构

你没注意到内层 foreach 也同时终止了吗?

作者: xuzuning   发布时间: 2011-12-05

内层并没有终止啊?
array_splice($a,4,1) 默认重置里数组指针,因此内层重新执行了一遍循环

如果改为 array_splice($a,4,1,true),内层就成了死循环,是何原理,我的理解,删掉一个数组元素,不就是少循环一次吗,为何出现这种情况

作者: abiao5555   发布时间: 2011-12-05

相关阅读 更多