zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    208. Implement Trie (Prefix Tree)
    97. Interleaving String
    314. Binary Tree Vertical Order Traversal
    windows获取IP和MAC地址【Qt】
    阳历阴历转换
    getDat(char *val)获得某一天是这一年中的第几天
    int位数的获取及int类型转char *
    以二进制形式输出char *数据
    char类型变量二进制形式输出
    int类型变量以二进制形式输出
  • 原文地址:https://www.cnblogs.com/caihuafeng/p/5280023.html
Copyright © 2011-2022 走看看