BeWithYou

胡搞的技术博客

  1. 首页
  2. PHP
  3. foreach循环踩坑

foreach循环踩坑


这里的foreach是PHP的。看下面一段代码会输出什么?

$arr = [1,2,3,4,5];
foreach($arr as $k => $v){
    if($v == 2 || $v == 4){
        array_splice($arr,$k,1);
    }
}
print_r($arr);
//output
//Array
//(
//    [0] => 1
//    [1] => 3
//    [2] => 4
//)

本以为foreach循环中改变数组的内容会影响到每次遍历,其实不然。比如中途用array_splice删除并重新索引了数组,并不会减少遍历的次数。

因为foreach的内容如果不是引用,它会在一开始将数组的所有内容复制一份进行遍历,不会管中途对原数组做了什么修改。如果需要达到我们一边遍历一遍修改的目的,可以使用引用的方式。如下,只需要加上引用&标记即可。

$arr = [1,2,3,4,5];
foreach($arr as $k => &$v){
     echo $k;
    if($v == 2 || $v == 4){
        array_splice($arr,$k,1);
    }
}
print_r($arr);
//ouput
//01012012Array
//(
//    [0] => 1
//    [1] => 3
//    [2] => 5
//)
回到顶部