循环是个好东西,用循环加几条简单的语言可以实现处理多条数据的功能,充分展示了计算机是为人民服务的。但是如果利用不好,和谐社会便被打破了。现举两个陷阱。
一:双重循环中建立的临时变量。
首先临时变量就是临时的,不能和全局变量起重名,除非这个全局变量是个全局的临时变量(随用随赋值)。这一点在需要临时变量与某个变量做比较操作时尤为重要。现在举一个双重循环的例子:
以下是代码片段: foreach($arr0 as $k0 => $arr1) { foreach($arr1 as $k1 => $v1) { $total +=$v1; } if($total > 1000) { echo "No !\n"; } } |
如果你只是想单独分析数据$arr1,那很遗憾这个程序的结果是失败的。因为$total的值会被下一次循环继续累加,然后在判断大小的时候会一路报错。如果你在第二次循环前把$total置0就OK了。
二:有序值查漏的陷阱。
我想,这是思维严谨的问题。
但一个有序排列的数组,我们可以简化为一个数字为键的数组$arr。原始数组是否有序是无所谓了,因为有ksort()函数,可以帮助我们排序。这个数字有序但不连续,例如键为:1、2、6、7,中间漏了3、4、5,现在弄个程序找出来。
假定数组的键起点为0,终点以$arr为准。我一拍脑袋,写下如下程序:
以下是代码片段: $i = 0; foreach($arr as $k => $v) { if($i++ != $v) { echo "$v | "; } } |
此程序的恶果为,一旦遇到不连续的键,以后的键值都被认作不连续了,原因在于$i的自增方式有问题。你可以自己实践一下加强体验。
有效的程序如下,用while我们可以避免风险。
以下是代码片段: $i = -1; foreach ($arr as $k => $v) { while(++$i != $k) { echo "$i | "; } } |
当然,实际程序中还得考虑$i溢出的问题。