【第22期】观点:IT 行业加班,到底有没有价值?

PHP学习:foreach的深入 和COW(copy-on-write )的验证

原创 2016年08月29日 14:45:05

2016-08-28


foreach的传值和传址

<?php
 $stu=['tom','jim','cheery'];
  foreach($stu as $var)//传值
  {
         $var.=$var;//连续定义变量相当于$var=$var.$var;
         echo $var,'<br>';
  }
  print_r($stu);
  echo '<hr>';
  //out put
  //tomtom
  //jimjim
  //cheerycheery
  //Array ( [0] => tom [1] => jim [2] => cheery )

  $stu=['tom','jim','cheery'];
  foreach($stu as &$var)//传址
  {
         $var.=$var;//连续定义变量相当于$var.$var
         echo $var,'<br>';
  }
  print_r($stu);
  //tomtom
  //jimjim
  //cheerycheery
  //Array ( [0] => tomtom [1] => jimjim [2] => cheerycheery )
?>

foreach的本质

遍历数组的本质是在创建一个原数组的副本

//遍历数组的过程:
//初始化指针==》给值($var)赋值==》给键($key)赋值==》指针下移一位==》重复上一步操作。
//遍历数组的本质其实遍历原数组的副本。
//当没有对原数组执行写(修改)操作的时候,那么原数组不发生改变;
//如果发生修改那么是对原数组精选修改而对遍历所用的数组副本不造成影响。
//test1:
    $arr=array('A','B','C','D','E');
    foreach($arr as $key=>$var)
    {
         $arr[]='input';//每次遍历都会给$arr的数组增加一个input。
         echo $var;//依次输出$arr的值。
         echo '<br>';
    }
    print_r($arr);
    echo '<hr>';
//output
//  A
//  B
//  C
//  D
//  E
//  Array ( [0] => A [1] => B [2] => C [3] => D [4] => E [5] => input [6] => input [7] => input [8] => input [9] => input )

//从上面的测试中可以看出:虽然每次执行遍历的时候都会在数组中加一个input,但是遍历的结果中并没有出现增加的input
//foreach的操作我们可以分解为如下的操作。
   //第一次遍历
   //$arr_copy=$arr;
   //reset($arr);
   //$var=$value;将$arr_copy中的值赋值给$var
   //$key=$key  ;将$arr_copy中的键赋值给$key
   //next($arr) ;将指针下移一位
   //$arr[5]='input';给$arr数组增加一个下标为5的键,并将‘input’赋值给他。
   //以此类推...

foreach遍历数组的时候会触发COW…

有关foreach的介绍详见下面文章:
http://php.net/manual/en/control-structures.foreach.php
有关COW的解释详见下面的文章:
http://www.php-internals.com/book/?p=chapt06/06-06-copy-on-write

版权声明:本文为博主原创文章,未经博主允许不得转载。 举报

相关文章推荐

标准C++类string的Copy-On-Write技术(一)

&lt;iframe align="center" marginwidth="0" marginheight="0" src="http://www.zealware.com/csdnblog.html" frameborder="0" width="728" scrolling="no" height="90"&gt;&lt;/iframe&gt;

linux内核分析(转自某位大哥网上的笔记)

启动     当PC启动时,Intel系列的CPU首先进入的是实模式,并开始执行位于地址0xFFFF0处的代码,也就是ROM-BIOS起始位置的代码。BIOS先进行一系列的系统自检,然后初始化位...

欢迎关注CSDN程序人生公众号

关注程序员生活,汇聚开发轶事。

Android的Zygote的COW(Copy on Write)技术研究

        fork()和execve()是标准的Linux系统调用,可以组合生成新的进程开始新的任务。上篇文章学习了fork()的使用,execve()呢就是执行新的文件中的main函数,开始了新的进程任务。fork出的子进程共享父进程的内存结构信息和库链接信息等,而后子进程调用execve()将新进程所需的代码加载到内存中,此时,父进程的信息将被擦除,并重新分配子进程的内存给新的任务代码。如果此时子进程所需的共享库已经被加载到内存中,就不用重新加载了,只需要跟新链接信息即可。否则还要从存储器中将库加载至内存,费时间。

快学Big Data

学习态度: 求知若饥, 虚心若愚。 珍惜小的概率,维护链接的范围。 当你的才华撑不起你的野心时,请静下心来好好的读书。 杂谈: 1-1)大数据研发型人才 了解大数据技术人才  --->  ...

【转】Copy-On-Write技术 [ linux fork进程时使用技术]

http://www.cnblogs.com/chenglei/archive/2009/08/06/1540175.html   <p style="font-size: 13px; line-height: 1.4; margin: 10px auto; font-fami
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)