例1
$a=[1,2,3];
foreach($a as &$v){
print($v);
print_r($a);
}
foreach($a as $v){
print($v);
print_r($a);
}
// 执行结果
1Array
(
[0] => 1
[1] => 2
[2] => 3
)
2Array
(
[0] => 1
[1] => 2
[2] => 3
)
3Array
(
[0] => 1
[1] => 2
[2] => 3
)
1Array
(
[0] => 1
[1] => 2
[2] => 1
)
2Array
(
[0] => 1
[1] => 2
[2] => 2
)
2Array
(
[0] => 1
[1] => 2
[2] => 2
)
解读:
- 第一个循环没什么特别,只是在遍历数组的最后一个元素后,'$v'值的地址指向数组的最后一个元素
- 第二个循环的第一次遍历,遍历数组的第一个元素,'foreach($a as $v)' 这个操纵会把第一个元素赋值给'$v',而且此时'$v'的地址指向数组的最后一个元素,所以第一次遍历后数组是{1,2,1}
- 第二个循环的第二次遍历,同上
- 第二个循环的第三次遍历,此时循环遍历的值刚好是'$v'地址指向的值
例2
$d = ['a', 'b', 'c'];
foreach($d as $k => $val)
{
$val = &$d[$k];
print($val);
print_r($d);
}
// 执行结果
aArray
(
[0] => a
[1] => b
[2] => c
)
bArray
(
[0] => b
[1] => b
[2] => c
)
cArray
(
[0] => b
[1] => c
[2] => c
)
解读:
- 循环的第一次遍历,将'$val'的值指向数组的第一个值的地址
- 循环的第二次遍历,'foreach($d as $k => $val)'这个操作把'$val'赋值成'b',所以数组的第一个元素也变成'b'
- 循环的第三次遍历,同上
网友评论