示例一
使用引用,可以方便快速的修改数组元素,但是,当 foreach 的元素变量名称一样的时候,例如下例变量名称都是引用类型的话,将引发一些问题。
$array1 = [1, 2, 3];
// 执行完这个语句后,$value始终指向$array[2]这个元素
foreach ($array1 as &$value) {} // $array = [1,2,3]
$array2 = $array1;// 就连$value的引用也复制了过来,详细见示例二
foreach ($array2 as $value) {//array1和array2的第3个元素都会被修改
// 第1次循环之后$array=[1,2,1]
// 第2次循环之后$array=[1,2,2],此时数组的第三个元素变成了倒数第二个元素,然后作为下一次循环
// 第3次循环之后$array=[1,2,2]
}
var_dump($array1);// [1,2,2]
var_dump($array2);// [1,2,2]
所以针对这个问题,同一个作用域里,foreach的变量不能一样。
示例二
如果先对数组元素进行引用,然后再赋值给另外一个变量,那么两个数组的的这个元素,再内存中是共用一块地址的,对引用变量的修改,会影响到多个数组
$array1 = [1, 2, 3];
$value = &$array1[2];
$array2 = $array1;
$value = 33;
print_r($array1); // [1,2,33]
print_r($array2);// [1,2,33]
如果先复制然后在引用,就不会有这个问题,也就是说,数组复制的时候,要注意数组的元素有没被引用
$array1 = [1, 2, 3];
$array2 = $array1;
$value = &$array1[2];
$value = 33;
print_r($array1); // [1,2,33]
print_r($array2);// [1,2,3]
示例三
如下代码
$arr = array('a1', 'a2', 'a3');
foreach ($arr as $key => $value) {
// $value是$arr[$key]的引用,修改$value的值会修改$arr[$key]的值
$value = &$arr[$key];
print_r($arr);
}
print_r($arr);
输出结果是
Array
(
[0] => a1
[1] => a2
[2] => a3
)
Array
(
[0] => a2
[1] => a2
[2] => a3
)
Array
(
[0] => a2
[1] => a3
[2] => a3
)
Array
(
[0] => a2
[1] => a3
[2] => a3
)
如果不想受到影响,可以在$value
上加个&
,这样每次foreach的时候,会断开原来的引用,重新对新的数组元素进行引用
$arr = array('a1', 'a2', 'a3');
foreach ($arr as $key => &$value) {
// $value是$arr[$key]的引用,修改$value的值会修改$arr[$key]的值
$value = &$arr[$key];
print_r($arr);
}
print_r($arr);
评论 (0)