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

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

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

写时拷贝(copy-on-write) COW技术
  • u012333003
  • u012333003
  • 2014年05月06日 17:52
  • 2128

《重新深入学习PHP教程》(1)(2015-09-05)

接触PHP前前后后、断断续续也有5、6年了,期间也做过一些中小项目,原以为PHP这种技术早晚会死,没想到现在随着微信的火爆以及移动互联网的火爆它并没有被淘汰,PHP7听说也已经出来了。本人当时开始学习...
  • tongtong515
  • tongtong515
  • 2015年09月05日 16:11
  • 593

php array_map,for,foreach性能测试

array_map是php自带的使用回调函数的数组批处理函数,看到这类函数的结构我就怀疑其处理效率。做了个小测试...
  • u011478276
  • u011478276
  • 2016年12月16日 14:03
  • 1060

Copy-On-Write(写入时复制)技术

看google的hdfs论文时看到这个概念。 Copy-On-Write属于逻辑快照的一种,还有一种物理快照,百度了一下 ,快照里边概念还挺多,主要是以前没接触过。以后再整理。 Copy-On-Wr...
  • chen517611641
  • chen517611641
  • 2013年12月30日 11:14
  • 2138

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

shared_ptr实现COW(Copy-On-Write)
  • zhangxiao93
  • zhangxiao93
  • 2016年10月11日 22:53
  • 960

PHP7和PHP5.6在foreach里面使用current的区别

脚本1$arr = array(1,2,3,4,5,6,7,8,9); var_dump(current($arr)); foreach ($arr as $key => $value) { ...
  • alexander_phper
  • alexander_phper
  • 2017年01月16日 17:22
  • 1479

php代码优化系列(二) -- array_walk 和 foreach, for 的效率的比较

array_walk 和 foreach, for 的效率的比较
  • jayxujia123
  • jayxujia123
  • 2010年11月05日 16:29
  • 6989

深入解析php中的foreach问题

本篇文章是对php中的foreach问题进行了详细的分析介绍,需要的朋友参考下 前言: php4中引入了foreach结构,这是一种遍历数组的简单方式。相比传统的for循环,foreach能够更加...
  • sanbingyutuoniao123
  • sanbingyutuoniao123
  • 2016年05月09日 15:57
  • 1095

Copy-on-write(COW)

http://blog.csdn.net/haoel/archive/2004/06/23/24058.aspx1、             概念 Scott Meyers在《More Effecti...
  • amyeric
  • amyeric
  • 2011年04月12日 17:08
  • 464

Ajax深入学习笔记

最近在学习ajax,下面整理了一下学习的内容,以便巩固用。 先来看看为什么要用ajax,也就是同步和异步是什么:同步和异步同步的意思就是客户端提交表单,发起请求后需要一直等待服务器端的响应,收到服务...
  • VivianHope
  • VivianHope
  • 2015年06月03日 15:54
  • 1804
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:PHP学习:foreach的深入 和COW(copy-on-write )的验证
举报原因:
原因补充:

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