Home » Code » php数组引用时的一些现象

php数组引用时的一些现象

看一个例子:

$arr = array(1, 2, 3);
foreach($arr as $v)
{

}
var_dump(current($arr));//bool(false)

$arr = array(1, 2, 3);
foreach($arr as $k=>$v)
{
	$arr[$k] = $v;
}
var_dump(current($arr));//int(2)

以上情况要怎么解释?foreach循环的时候,循环的是arr的一个复制arrcopy,这个arrcopy每循环一次复制一次,二者共用一份哈希表,指向相同的结构体。情况一循环时拨动arrcopy的指针,也即拨动arr的指针(二者共用一份),循环结束后指针指向为空,所以当前值取不到,为bool。而情况二,循环开始,二者还是共用一份哈希表,向前拨动一位指针,定位到2,这时arrcopy被重新赎值,就复制了一份哈希表(写时复制),二者不再共用一份,后面的循环拨动的就只是arrcopy的指针,arr的指针停留在了2这个位置上。

$arr = array(1, 2, 3);
$tmp = $arr;
$arr[1] = 99;
echo $tmp[1];//1

$arr = array(1, 2, 3);
$x = &$arr[1];
$tmp = $arr;
$arr[1] = 99;
echo $tmp[1];//99

以上又如何解释?为何对下标1这个值进行了一下引用,情况就不一样了?一时半会儿真说不清楚,姑且不说了,记着。

再看一道面试题:

$arr = array(1, 2, 3, 4);
foreach($arr as &$v)
{

}

foreach($arr as $v)
{
	print_r($arr);
}

以上输出的结果为:

Array
(
    [0] => 1
    [1] => 2
    [2] => 3
    [3] => 1
)
Array
(
    [0] => 1
    [1] => 2
    [2] => 3
    [3] => 2
)
Array
(
    [0] => 1
    [1] => 2
    [2] => 3
    [3] => 3
)
Array
(
    [0] => 1
    [1] => 2
    [2] => 3
    [3] => 3
)

这结果看着迷糊,问题就出在引用上,第一个循环只是愰子,换成$v = &arr[3]结果是一样的。第一个循环结束后,$v就是$arr[3]的引用。第二个循环开始,arrcopy的值分别赎给$v,先是arrcopy[0],值为1,赎给了$v,而$v是arr[3]的引用,就影响了arr[3]的值,arr[3]就变成了1,整个arr就变成1,2,3,1,接着arrcopy[1]的值2赋给$v,就是arr[3]变为2,整个arr为1,2,3,2,接着arrcopy[2]为3,arr变为1,2,3,3,接着arrcopy[3]为3注意不是4,这是新的一份copy,整个过程是不断的copy,不是一开始复制一份1,2,3,4就一直沿用。

这些东西感觉实际并没什么用处,但了解一下还是有些用处。以上例子就提醒我们:

  • 慎用引用,新版php在函数调用时就废弃了参数引用,定义时还可以用。
  • 数组循环结束后,习惯的reset一下数组并unset一下$v。

Leave a Reply

Your email address will not be published. Required fields are marked *

*

Time limit is exhausted. Please reload CAPTCHA.