zoukankan      html  css  js  c++  java
  • php 中的引用(&)与foreach结合后的一个注意点

    关于php中引用的概念及foreach循环的的应用就不多说了,php文档已经说的很明白了。直接上一段代码:

    <?php
    $arr = array(1,2, 3);
    foreach($arr as &$temp){
    $temp *=2;
    }

    var_dump($arr); //---------------位置1--------------------

    foreach($arr as $temp) {

    }

    var_dump($arr); //---------------位置2--------------------
    上面代码中 位置1 处输出:

    array(3) {
    [0] =>
    int(2)
    [1] =>
    int(4)
    [2] =>
    int(6)
    }
    上面代码中 位置2 处输出:

    array(3) {
    [0] =>
    int(2)
    [1] =>
    int(4)
    [2] =>
    int(4)
    }

    “位置1”输出解析:

    了解引用的同学不难理解,第一个foreach循环中:

    第一次循环 $temp 是 arr[0] 的引用;

    第二次循环 $temp 是 arr[1] 的应用;

    第三次循环 $temp 是 arr[2] 的引用;

    而序号内部值都乘以2,所以 最后数组中的值变成了[2, 4, 6] 

    array(3) {
    [0]=>
    &int(1)
    [1]=>
    int(2)
    [2]=>
    int(3)
    }
    array(3) {
    [0]=>
    int(1)
    [1]=>
    &int(2)
    [2]=>
    int(3)
    }
    array(3) {
    [0]=>
    int(1)
    [1]=>
    int(2)
    [2]=>
    &int(3)
    }

    “位置2”输出解析:

    foreach ($a as &$v) {} 時,在迴圈結束後 $v 值不會被消滅,还是存在, $v行赋值就相当于对 arr[2] 进行赋值

    如上所述,循环结束后 $temp 是 arr[2] 的引用,根据php引用原理,每次赋值都会改变引用的值,所以对 $temp 进行赋值就相当于对 arr[2] 进行赋值。在第二个foreach循环中:

    第一次循环结束后,数组变为[2, 4, 2];

    第二次循环结束后,数组变为[2, 4, 4];

    第三次循环结束后,数组变为[2, 4, 4];

    所以 位置2 的输出便是如上。

    array(3) {
    [0]=>
    int(1)
    [1]=>
    int(2)
    [2]=>
    &int(1)
    }
    int(1)
    int(2)
    array(3) {
    [0]=>
    int(1)
    [1]=>
    int(2)
    [2]=>
    &int(2)
    }
    int(2)
    int(2)
    array(3) {
    [0]=>
    int(1)
    [1]=>
    int(2)
    [2]=>
    &int(2)
    }

    简单,但谈不上完美,就是在使用了引用的 foreach 之后, unset 掉 $v , 开始的例子改为:

    <?php
    $ar = array(1, 2, 3);
    var_dump($ar);
    foreach ($ar as &$v) {}
    unset($v);
    foreach ($ar as $v) {}
    var_dump($ar);
    ?>
    运行结果:

    array(3) {
      [0]=>
      int(1)
      [1]=>
      int(2)
      [2]=>
      int(3)
    }
    array(3) {
      [0]=>
      int(1)
      [1]=>
      int(2)
      [2]=>
      int(3)
    }

  • 相关阅读:
    c++11:智能指针
    C++11:右值引用
    结构体与联合体
    数组与指针的区别?
    堆和栈的理论知识
    笔试点杂烩
    2、8、10、16进制输出
    单链表的反转
    签约新国都
    Linux下使用autoconf 和 automake 编译简单的HelloWorld
  • 原文地址:https://www.cnblogs.com/matengfei123/p/10404112.html
Copyright © 2011-2022 走看看