循环中的逻辑陷阱 (PHP心得)
发布于 2008-04-10 18:42 1 阅读:8,268 评论:1 标签: 陷阱 循环

  循环是个好东西,用循环加几条简单的语言可以实现处理多条数据的功能,充分展示了计算机是为人民服务的。但是如果利用不好,和谐社会便被打破了。现举两个陷阱。

  一:双重循环中建立的临时变量。

  首先临时变量就是临时的,不能和全局变量起重名,除非这个全局变量是个全局的临时变量(随用随赋值)。这一点在需要临时变量与某个变量做比较操作时尤为重要。现在举一个双重循环的例子:

以下是代码片段:
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溢出的问题。

展开全文  
收起全文