为什么这个 PHP 函数会无限循环?

3
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);

我想研究如何生成一个不重复数字的数组,虽然这肯定不是最有效的方式,但是我找不出为什么它在第一次迭代时无限循环。我一遍又一遍地尝试逻辑分析,但似乎有些东西我还没发现。


11
毕竟,谁需要合理的缩进呢。 - user895378
1
顺便提一下,这被称为“无限循环”。此外,@andrewsi的解决方案是正确的。 - Matt
2
@rdlowrey确实...或者像拼写检查器这样的装置 - supervacuo
3个回答

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

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

尝试使用:

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

===?对于 true 来说是必要的吗?我对 PHP 一无所知,但其他答案只有 ==。如果建议或必要的话,可能值得详细说明。 - Bill Woodger
4
在这段代码中,使用truefalse是明确的,所以这样做不会有任何影响。我个人在自己的代码中通常使用===,因为它是一种更严格的检查方式。 - andrewsi

6

除了将=更改为==之外,您还在错误的位置重置了$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);
?>

6

您目前是在赋值,而不是在检查(这将始终为真)。

将其更改为:while ($Reccuring == true);


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接