7.x 的foreach已经不会修改内部指针了
<?php
# 值遍历
$arr = [0, 1, 2, 3, 4, 5];
$ref = &$arr;
foreach ($arr as $v) {
if ($v === 0) {
unset($arr[3]);
}
echo $v;
}
// output in 5.x: 01245
// output in 7.x: 012345 // 7.x版本下,通过值遍历时,底层操作的始终是数组的副本
# 通过引用来进行迭代 foreach ($arr as &$v)
$arr = [0, 1, 2, 3, 4, 5];
foreach ($arr as &$v) {
if ($v === 0) {
unset($arr[3]);
}
echo $v;
}
// output in 5.x: 01245
// output in 7.x: 01245
引用事例
<?php
$data = ['a','b','c'];
foreach ($data as $k => &$v){
//
}
var_dump($data);
foreach ($data as $k => $v){
//
}
var_dump($data);
第一次输出 [‘a’,’b’,’c’]
第二次输出 [‘a’,’b’,’b’]
第一次遍历运用引用 $v的地址指向数组最后一个位置,即c的位置;
第二次遍历将值赋给$v,值a赋给$v,指向c,此时a[2]=a;执行到第二个元素,b赋给$v,赋给$v指向地址a[2],此时数组a[2]=b;执行到第3个元素,此时a[2]=b,b赋给$v,赋给$v指向地址,此时数组a[2]=b
https://segmentfault.com/a/1190000019637833