php foreach引用陷阱

先看这段代码:

<?php
$arr = array('a','b','c');
foreach($arr as &$a){
} 
print_r($arr);
print_r($a);
foreach($arr as $a){
}
print_r($arr);
print_r($a); 
?>

咋一看,就是两个空循环,应该不会对$arr有什么影响,但是实际结果是:

Array ( [0] => a [1] => b [2] => c ) c

Array ( [0] => a [1] => b [2] => b //出问题了 ) b

这就是php文档上写的引用陷阱。

它发生的原因是,php没有局部变量,第一个循环的引用变量$a继续在第二个循环中被赋值,

第一循环

$a = $arr[0]

$a = $arr[1]

$a = $arr[2]

第二循环

$arr[2] = $arr[0]  //$arr[2] = ‘a’

$arr[2] = $arr[1]  //$arr[2] = ‘b’

$arr[2] = $arr[2] //$arr[2] = ‘b’


这是php文档上说明了的陷阱,但是包括我在内很多人仍然要踩进去一回,哈哈。

 

这里补充foreach的一点知识:

<?php
$arr = array();
for($ii = 0 ; $ii < 10 ; $ii ++){
	$arr[] =  array('k'=>$ii . '_v','p'=>'hah');
}
print_r($arr);
$narr = array();
foreach($arr as $i){
	$i['k'] = 'changed';
	unset($i['p']);
	$narr[] = $i  ;
}
print_r($arr);
print_r($narr);
?>

代码里创建一个数组$arr,然后使用foreach遍历,改变每个元素的值。

然后发现原来数组里的值没有变化,而$narr里面的是修改后的元素。

此例说明foreach循环中的元素是拷贝变量,修改它不会影响原来的数组。

所以我们使用引用来达到修改修改元素的目的。


Total views.

© 2013 - 2018. All rights reserved.

Powered by Hydejack v6.6.1