• foreach的指针问题


    从代码:

            $arr = array(1,2,3,4,5);
            echo '$arr = array(1,2,3,4,5)','<br>';
            foreach($arr as $key => &$row) {
                echo key($arr), '=>', current($arr), "||";
                echo $key, '=>', $row, "<br>";
            }
     
            foreach($arr as $key => $row) {
                echo key($arr), '=>', current($arr), "||";
    //next($arr); echo $key,
    '=>', $row, "<br>"; } exit;

    运行的结果:

    $arr = array(1,2,3,4,5)
    1=>2||0=>1
    2=>3||1=>2
    3=>4||2=>3
    4=>5||3=>4
    =>||4=>5


    1=>2||0=>1
    1=>2||1=>2
    1=>2||2=>3
    1=>2||3=>4
    1=>2||4=>4

    (如果删除第二个foreach前的注释号,结果与第一个带引用的foreach相同)

    来说,可以发现三个问题

    1.foreach语句执行之后,被操作的数组的指针就被往后移动了一位,并取出了数据赋值给$key,$row

    2.在两种方式里面使用next,end等函数对foreach的执行不造成影响,因为即使在数组循环的过程中使用函数end将操作数组的指针指向最后一个元素也会继续执行完foreach语句,所以可以推测foreach执行过程中会有一个全局的变量来存储当前操作数组的指针,而是用了next,end等函数之后会生成一个副本。

    3.foreach使用引用与非引用可能就在于副本什么时候生成,对于非引用的直接在foreach之后就会生成,对于引用的在调用next,end等函数之前才会生成,也就是在语义分析的时候就已经判断了。

  • 相关阅读:
    mysql中使用row_number()函数
    Android开发环境的搭建之(二)Android Studio的安装
    Android开发环境的搭建之(一)Java开发环境的安装
    进程与线程
    工作起始之博客搬家
    MapReduce的自制Writable分组输出及组内排序
    map端join和reduce端join的区别
    String.StartsWith 方法
    RPC和心跳机制
    MAPREDUCE中的序列化
  • 原文地址:https://www.cnblogs.com/kudosharry/p/3795314.html
Copyright © 2020-2023  润新知