php foreach引用陷阱
in php - Hits()
先看这段代码:
<?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循环中的元素是拷贝变量,修改它不会影响原来的数组。
所以我们使用引用来达到修改修改元素的目的。