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