PHP中foreach有关引用的问题

软件开发的过程中,细节处理非常重要,说得大一点就是细节决定成败,别人不懂的地方,你懂,别人没注意到的细节,你注意到了,这就是你胜出对方的地方,这样就体现出了你的价值。

下面是几个foreach循环中引用相关的例子,有时候去一家公司面试的时候有可能会遇到类似的笔试题。

 1 //test1
 2 $items = array(1,2,3,4,5);
 3 foreach ($items as &$item1) {
 4     echo "item1: $item1" . l;
 5 }
 6 $item1 = 3;
 7 print_r($items);
 8 foreach ($items as $item2) {
 9     echo "item2: $item2" . l;
10 }
11 
12 //test2
13 $arr = array("1"=>"111","2"=>"222","3"=>"333");
14 foreach($arr as $key=>$value)
15 {
16     echo $key."=>".$value."
";
17     $key = &$arr[$key];
18     print_r($arr);
19 }
20
代码解释:
我们发现,原来的数组被修改了,是为什么呢?我们来研究一下。
代码中关键的地方是:$key = &$arr[$key];
$key 为 $arr[$key] 的引用,也就是,当$key 被修改的时候,$arr[$key] 也被修改为对应的值。
 
首先,我们要了解一下,foreach 的原理,它是将数组的值,分别赋值给$key 和 $value ;
所以,$key ,$value 也是普通的一个变量。
 
接着分析,第一遍循环时,$key = &$arr[$key];意思是 &$arr[1] 指向$key 这个变量。
foreach 循环到第二遍的时候,首先,$key 被赋值为2,此时,再关注一下,$key = &$arr[$key];
结果是:$arr[1] 被赋值为此时的新的$key ,也就是2.
第二遍循环结束后,原来的数组变为:
Array
(
    [1] => 2
    [2] => 222
    [3] => 333
)
 
同理,第三次循环结束后,则为:
Array
(
    [1] => 2
    [2] => 3
    [3] => 333
)
 
到此,已经大概说明白了。
 
21 //test3
22 $arr = array("1"=>"111","2"=>"222","3"=>"333");
23 foreach($arr as $key=>$value)
24 {
25     $key  = &$arr[$key];
26     $key = "hello";
27     unset($key);
28     print_r($arr);
29 }

代码解释:
我们直接在每次循环中,给$key 赋值为 “hello ”,为了不影响,然后,把$key 变量释放掉。
这样应该,就比较清楚了吧。

输出如下:

 1 输出如下:
 2 test1
 3 item1: 1
 4 item1: 2
 5 item1: 3
 6 item1: 4
 7 item1: 5
 8 Array
 9 (
10     [0] => 1
11     [1] => 2
12     [2] => 3
13     [3] => 4
14     [4] => 3
15 )
16 item2: 1
17 item2: 2
18 item2: 3
19 item2: 4
20 item2: 3
21 
22 test2
23 1=>111
24 Array
25 (
26     [1] => 111
27     [2] => 222
28     [3] => 333
29 )
30 2=>222
31 Array
32 (
33     [1] => 2
34     [2] => 222
35     [3] => 333
36 )
37 3=>333
38 Array
39 (
40     [1] => 2
41     [2] => 3
42     [3] => 333
43 )
44 
45 test3
46 Array
47 (
48     [1] => hello
49     [2] => 222
50     [3] => 333
51 )
52 Array
53 (
54     [1] => hello
55     [2] => hello
56     [3] => 333
57 )
58 Array
59 (
60     [1] => hello
61     [2] => hello
62     [3] => hello
63 )

延伸阅读:
http://www.baidu.com/s?wd=php%20foreach%20引用
http://www.sogou.com/web?query=php%20foreach%20引用
http://www.so.com/s?q=php%20foreach%20引用
http://blog.sina.com.cn/s/blog_6e322ce70100xx1t.html

原文地址:https://www.cnblogs.com/caihuafeng/p/5280023.html