【问题标题】:Why does this PHP function cycle endlessly?为什么这个 PHP 函数会无限循环?
【发布时间】:2012-08-21 19:41:40
【问题描述】:
function nonrecgen($min, $max, $amount) {
for($i=0;$i<$amount;$i++) {

$NrArray[$i] = rand($min,$max);
echo $NrArray[$i];
do  {
    for($j=0;$j<=$i;$j++) {
      if ($NrArray[$j] == $NrArray[$i]) {
      $NrArray[$i] = rand($min,$max);   }     
                          }
       $Reccuring = false;
   if ($i > 0) {
    for($k=0;$k<=$i;$k++) {
      if ($NrArray[$k] == $NrArray[$i]) {
       $Reccuring = true;               }
                          }
               }
    }
while ($Reccuring = true);
                          }
Return $NrArray;                                        
                                        }

$Test = nonrecgen(0,1,2);
print_r($Test);

我想研究如何生成一个非重复数字数组,虽然这肯定不是我认为最有效的方法,但我似乎无法弄清楚为什么它在第一次迭代时会无限循环。我一遍又一遍地尝试逻辑分析,但一定有我遗漏的东西。

【问题讨论】:

  • 毕竟谁需要合理的缩进。
  • 仅供参考,这称为无限循环。另外,@andrewsi 的解决方案是正确的。
  • @rdlowrey 确实......或者像a spelling checker这样的发明

标签: php cycle


【解决方案1】:
do {
...
} while ($Reccuring = true);

因为您的 while 语句将 $Reccuring 设置为 true,而不是对其进行评估。

试试:

do {
...
} while ($Reccuring === true);

【讨论】:

  • ===? true 有必要这样做吗?我对PHP一无所知,但其他答案只有==。如果它是可取的/必要的,它可能值得详细说明。
  • @BillWoodger - 有了这段代码,它不会有什么不同,因为他明确地只使用了truefalse;我倾向于在我自己的代码中使用=== 作为默认值,只是因为它是一个更严格的检查。
【解决方案2】:

除了 === 之外,您还在错误的位置重置了 $Recurring

<?
function nonrecgen($min, $max, $amount) 
{
    for($i=0;$i<$amount;$i++) 
    {
        $NrArray[$i] = rand($min,$max);
        do  
        {
            for($j=0;$j<=$i;$j++) 
            {
                if ($NrArray[$j] == $NrArray[$i]) 
                {
                    $NrArray[$i] = rand($min,$max);  
                }     
            }
            if ($i > 0) 
            {
                for($k=0;$k<=$i;$k++) 
                {
                    if ($NrArray[$k] == $NrArray[$i]) 
                    {
                        $Reccuring = true;               
                    }
                }
            }
            $Reccuring = false;
        }
        while ($Reccuring == true);
    }
    return $NrArray;                                        
}
$Test = nonrecgen(0,2,5);
echo "<pre>";
print_r($Test);
?>

【讨论】:

    【解决方案3】:

    您当前正在分配一个值而不是检查(这将始终是正确的)。

    改成:while ($Reccuring == true);

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-10-16
      • 1970-01-01
      • 2020-04-02
      • 2020-08-08
      • 1970-01-01
      • 2011-12-08
      • 2012-09-27
      相关资源
      最近更新 更多