foreach 使用技能

foreach 使用技巧

有段时间没有写博客了,主要是实验室里事情太多。今天被一个小问题纠结的了半天,不过最终还是解决了。

php里面foreach大家都知道,有两种形式。即

foreach (array_expression as $value)
    statement
foreach (array_expression as $key => $value)
    statement
第一种格式遍历给定的 array_expression 数组。每次循环中,当前单元的值被赋给 $value 并且数组内部的指针向前移一步(因此下一次循环中将会得到下一个单元)。

第二种格式做同样的事,只除了当前单元的键名也会在每次循环中被赋给变量 $key。相当于$key是数组的索引,$value是这个索引的值。

但是要注意: 除非数组是被引用,foreach 所操作的是指定数组的一个拷贝,而不是该数组本身。因此数组指针不会被 each() 结构改变,对返回的数组单元的修改也不会影响原数组。不过原数组的内部指针的确在处理数组的过程中向前移动了。假定 foreach 循环运行到结束,原数组的内部指针将指向数组的结尾。

相当于foreach是一个值传递而不是引用传递

但是我一开始没有注意到,结果就悲剧了。

本来是这样的,发现$con['checked']的值没有改变

 foreach($check as $stu){
						foreach($constantssysview->CONST_HXISYSTEM as $con){
							//echo $stu."==".$con['id'].'  '.($stu==$con['id']);
							if($stu==$con['id']){
								$con['checked']=1;
							}
						}

在php5之后,可以用引用的方法传即

 foreach($check as $stu){
						foreach($constantssysview->CONST_HXISYSTEM as &$con){
							//echo $stu."==".$con['id'].'  '.($stu==$con['id']);
							if($stu==$con['id']){
								$con['checked']=1;
							}
						}
但这很有可能引发另外一个问题,就是在其他的foreach中你也使用了&$con这个变量,这就可能会造成很多奇奇怪怪的问题而且难以发现。比我们常见的&$value这样传值。

更方便的我们可以这样传值安全无害轻松改。

foreach($check as $stu){
						foreach($constantssysview->CONST_HXISYSTEM as $key=>$con){
							//echo $stu."==".$con['id'].'  '.($stu==$con['id']);
							if($stu==$con['id']){
								$constantssysview->CONST_HXISYSTEM[$key]['checked']=1;
							}
						}