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; } }