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

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值