• 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)
    }

  • 相关阅读:
    cf 559a **
    poj 2599 单调栈 ***
    Unicode(UTF-8, UTF-16)令人混淆的概念
    Uber Go 语言编程规范
    深入理解 Go Channel
    如何使用 GZIP 来优化网站
    跨域资源共享 CORS 详解 [转载]
    使用dig查询DNS解析过程
    golang 实现简单DNS服务器
    一文看懂JS的异步
  • 原文地址:https://www.cnblogs.com/matengfei123/p/10404112.html
Copyright © 2020-2023  润新知