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
//)