zoukankan      html  css  js  c++  java
  • PHP foreach ($arr as &$value)

    foreach ($arr as &$value)

    看到一个有意思的东西:

    <?php
    $arr = ['1', '2', '3', '4'];
    
    foreach ($arr as &$i) {}
    echo implode($arr, ', ')."
    ";
    
    foreach ($arr as $i) {}
    echo implode($arr, ', ')."
    ";
    ?>

    运行结果:

    1, 2, 3, 4
    1, 2, 3, 3

    当使用了 & 引用后,下一次遍历数组的结果发生了变化

    调试下看看:

    $arr = ['1', '2', '3', '4'];
    
    foreach ($arr as &$i) {}
    echo implode($arr, ', ')."
    ";
    var_dump($arr);
    for($i=0;$i<count($arr);$i++){ echo $arr[$i]."-$i, "; var_dump($arr); } echo " "; foreach ($arr as $i) {} echo implode($arr, ', ')." ";

    运行结果(可以看到,第二次循环里面,每次循环后,最后一个数组元素一直被引用着,而且等于当时数组遍历的值):

    1, 2, 3, 4
    array(4) {
      [0]=>
      string(1) "1"
      [1]=>
      string(1) "2"
      [2]=>
      string(1) "3"
      [3]=>
      &string(1) "4"
    }
    1-0, array(4) {
      [0]=>
      string(1) "1"
      [1]=>
      string(1) "2"
      [2]=>
      string(1) "3"
      [3]=>
      &int(0)
    }
    2-1, array(4) {
      [0]=>
      string(1) "1"
      [1]=>
      string(1) "2"
      [2]=>
      string(1) "3"
      [3]=>
      &int(1)
    }
    3-2, array(4) {
      [0]=>
      string(1) "1"
      [1]=>
      string(1) "2"
      [2]=>
      string(1) "3"
      [3]=>
      &int(2)
    }
    3-3, array(4) {
      [0]=>
      string(1) "1"
      [1]=>
      string(1) "2"
      [2]=>
      string(1) "3"
      [3]=>
      &int(3)
    }
    
    1, 2, 3, 3

    因为使用了 & 后,会影响后面的赋值,可以使用 unset 销毁变量

    验证一下:

    $arr = ['1', '2', '3', '4'];
    
    foreach ($arr as &$i) {}
    echo implode($arr, ', ')."
    ";
    var_dump($arr);
    unset($i);
    for($i=0;$i<count($arr);$i++){
        echo $arr[$i]."-$i, ";
        var_dump($arr);
    }
    echo "
    ";
    foreach ($arr as $i) {}
    echo implode($arr, ', ')."
    ";

    输出:

    1, 2, 3, 4
    array(4) {
      [0]=>
      string(1) "1"
      [1]=>
      string(1) "2"
      [2]=>
      string(1) "3"
      [3]=>
      &string(1) "4"
    }
    1-0, array(4) {
      [0]=>
      string(1) "1"
      [1]=>
      string(1) "2"
      [2]=>
      string(1) "3"
      [3]=>
      string(1) "4"
    }
    2-1, array(4) {
      [0]=>
      string(1) "1"
      [1]=>
      string(1) "2"
      [2]=>
      string(1) "3"
      [3]=>
      string(1) "4"
    }
    3-2, array(4) {
      [0]=>
      string(1) "1"
      [1]=>
      string(1) "2"
      [2]=>
      string(1) "3"
      [3]=>
      string(1) "4"
    }
    4-3, array(4) {
      [0]=>
      string(1) "1"
      [1]=>
      string(1) "2"
      [2]=>
      string(1) "3"
      [3]=>
      string(1) "4"
    }
    
    1, 2, 3, 4

    分析:

    第一个 foreach 循环完以后,$i 指向 $arr[3],在第二个 foreach 循环时,这个引用没有断开
    第二个 foreach 循环中:
    第一次循环:$i = $arr[0] ;而 $i 又是 $arr[3] 的引用,则 $i 等于 $arr[3] 等于 $arr[0] 等于 '1' ,即 $i = $arr[3] = '1'
    第二次循环:$i = $arr[1] ;而 $i 又是 $arr[3] 的引用,则 $i 等于 $arr[3] 等于 $arr[1] 等于 '2' ,即 $i = $arr[3] = '2'
    第三次循环:$i = $arr[2] ;而 $i 又是 $arr[3] 的引用,则 $i 等于 $arr[3] 等于 $arr[2] 等于 '3' ,即 $i = $arr[3] = '3'
    第四次循环:$i = $arr[3] = 3;
     
     
     
  • 相关阅读:
    RapidJavaEE 项目 开发流程说明
    [转]Ext自定义vtype动态验证
    博客园cnblogs chrome右键插件 开发
    extjs 2.0 回车切换表单,支持chrome,firefox,ie
    简单备份策略
    搜狗室验室 Web开发相关技术报告下载
    <转>记录一些BCB6的使用心得
    (转)远程桌面3389多用户登陆补丁及端口修改(XP+WIN7)
    <转>Java调用C/C++编写的第三方dll动态链接库(非native API) JNI
    清理SVN目录中.SVN
  • 原文地址:https://www.cnblogs.com/lyc94620/p/10498108.html
Copyright © 2011-2022 走看看