最近看到php手册上的一段代码引起了注意 ,代码是这样的
<?php
$arr = array('a'=>'first', 'b'=>'second', 'c'=>'third');
foreach ($arr as &$a); // do nothing. maybe?
foreach ($arr as $a); // do nothing. maybe?
print_r($arr);
?>
Output:
Array
(
[a] => first
[b] => second
[c] => second
)
这样就有两个问题了
1.为什么第一次循环的时候只有第三个元素加上了&
2.再次循环时,第三个参数值发生了变化
闲话不说,直接上代码
foreach循环可以转化为for循环
foreach ($arr as $key => &$a){
}
for($i=0;$i<count($arr);$i++){
$b = &$arr[$i];
}
如果当我们减少循环量的时候,结果是这样的array (size=3) 0 => string 'first' (length=5) 1 => string 'second' (length=6) 2 => &string 'third' (length=5)
for($i=0;$i<count($arr)-2;$i++){
$b = &$arr[$i];
}
array (size=3) 0 => &string 'first' (length=5) 1 => string 'second' (length=6) 2 => &string 'third' (length=5)
这样我我就猜测了一下,&表示了对该元素有引用,所以我们可以这样测试一下
for($i=0;$i<count($arr)-2;$i++){ $b = &$arr[0]; $c = &$arr[1]; }array (size=3) 0 => &string 'first' (length=5) 1 => &string 'second' (length=6) 2 => &string 'third' (length=5)以上可以得出 当foreach时,系统会默认定义一个变量,单当我们一次循环的时候该变量被重新赋值,循环结束,该变量引用的为数组最后一个元素。当第二次循环的时候,可以看这个例子$arr1 = array("a" => 1, "b" => 2, "c" => 3); $arr2 = array("x" => 4, "y" => 5, "z" => 6); foreach ($arr1 as $key => &$val) { } foreach ($arr2 as $key => $val) { var_dump($arr1); }array (size=3) 'a' => int 1 'b' => int 2 'c' => &int 4array (size=3) 'a' => int 1 'b' => int 2 'c' => &int 5array (size=3) 'a' => int 1 'b' => int 2 'c' => &int 6array (size=3) 'a' => int 1 'b' => int 2 'c' => &int 6第三个元素被依次改变了值
array (size=3) 0 => &string 'first' (length=5) 1 => &string 'second' (length=6) 2 => &string 'third' (length=5)以上可以得出 当foreach时,系统会默认定义一个变量,单当我们一次循环的时候该变量被重新赋值,循环结束,该变量引用的为数组最后一个元素。