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

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

相关文章推荐

理解 shared_ptr实现copy-on-write(COW)

shared_ptr实现COW(Copy-On-Write)

C++ string 类 部分成员函数实现(实现COW copy-on-write)

虽然标题中说实现了·COW,但是事实上是很浪费的,并且命名也很不标准,代码也非常小学生,毕竟初学(给自己找借口.jpg),以后应该还会把这篇找出来认真修改一下的。 Mystring.h: #pragm...

Copy-on-write(COW)

http://blog.csdn.net/haoel/archive/2004/06/23/24058.aspx1、             概念 Scott Meyer...

Linux写时拷贝技术(copy-on-write)--COW

Linux写时拷贝技术(copy-on-write) 源于网上资料 COW技术初窥:       在Linux程序中,fork()会产生一个和父进程完全相同的子进程,但子进程在此后多会exec系统...

PHP中的写时复制(Copy On Write)

问题引入  首先来看看PHP中的赋值与引用问题  对于中间的那个问题,你的答案是什么呢?在今天之前,我的答案是会为b分配内存空间。因为我是这么理解的:   &赋值

php源码之路第六章第五节 ( 写时复制(Copy On Write))

在开始之前,我们可以先看一段简单的代码:执行这段代码,会打印出数字2。从内存的角度来分析一下这段代码“可能”是这样执行的:分配一块内存给foo变量,里面存储一个1; 再分配一块内存给bar变量,也存一...

C++并发实战:面试题5:读者写者问题copy on write

读者写者问题 这也是一个非常经典的多线程题目,题目大意如下:有一个写者很多读者,多个读者可以同时读文件,但写者在写文件时不允许有读者在读文件,同样有读者读时写者也不能写。 这里...

写时拷贝技术(copy-on-write)

传统的fork()系统调用直接把所有的资源复制给新创建的进程。这种实现过于简单并且效率低下,因为它拷贝的数据也许并不共享,更糟的情况是,如果新进程打算立即执行一个新的映像,那么所有的拷贝都将前功尽弃。...

聊聊并发-Java中的Copy-On-Write容器(转载)

Copy-On-Write简称COW,是一种用于程序设计中的优化策略。其基本思路是,从一开始大家都在共享同一个内容,当某个人想要修改这个内容的时候,才会真正把内容Copy出去形成一个新的内容然后再改,...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

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