【问题标题】:Exactly 5 numbers every time in php [duplicate]每次在php中恰好5个数字[重复]
【发布时间】:2015-12-28 20:42:31
【问题描述】:

我想将 5 个随机数添加到数组中,但每个数字必须不同。这是我到目前为止所拥有的......

$col_B = array();

for ($i=1; $i < 6; $i++) { 
    $rand = $col_ranges['B'][rand ( 0 , 14 )]; // calls to an array of numbers
    if(!in_array($rand, $col_B)){
        $col_B[] = $rand;   
    }
    else{ $i - 1;}

}
echo implode($col_B, '<br>');

【问题讨论】:

  • 还有什么问题?另请提供$col_ranges['B']的值
  • 它不会恰好添加 5 个数字,如果它不在数组中,则循环继续,而不是寻找另一个要添加的随机数。

标签: php arrays loops random


【解决方案1】:

我不会在这里使用 for 循环,而是使用 while 循环,直到随机数数组达到所需的计数为止。您的问题是,无论您是否将 $rand 添加到数组中,$i 都会继续递增。

$col_B = array();

while( count($col_B) < 5 ) 
{
    $rand = $col_ranges['B'][rand ( 0 , 14 )]; // calls to an array of number

    if( ! in_array($rand, $col_B) )
        $col_B[] = $rand;
}

【讨论】:

  • 这只是完全破坏了脚本,导致 503 错误,页面只是加载和加载。
  • 我不确定$col_ranges 是由什么组成的,所以很难调试。我的猜测是 $rand 不是你所期望的。试着打印出来看看你的期望
【解决方案2】:

问题在于,即使您刚刚选择了一个重复选项,您也会转到下一个 $i 值,这意味着您不会总是得到 5 个值。

但我建议不要尝试解决这个问题,直到你得到一个未使用的值,而是在你选择它们后删除它们,这样它们就不能再被选择了。

您可以先获取原始数组的临时副本,然后在选择元素时移除元素(使用array_splice),以便在下一次迭代中不再可用于选择:

$temp = $col_ranges['B'];
for ($i=1; $i < 6; $i++) { 
    $col_B[] = array_splice($temp, rand ( 0 , count($temp)-1 ), 1)[0];
}

请注意,赋予rand 的值的范围每次都会减小(count 会随着数组被array_splice 缩短而变小)。

这是更有效的,因为你肯定知道循环只会迭代 5 次,而且永远不会更多。

替代方案

一个有趣的替代方法是使用shufflearray_slice 函数,同样使用原始数组的副本。这样你就不需要循环了:

$col_B = $col_ranges['B'];
shuffle($col_B); // randomise the array
$col_B = array_slice($col_B, 0, 5); // keep only first 5

【讨论】:

    【解决方案3】:
    $col_B = array();
    
    for ($i=1; $i < 6; $i++) { 
      while(true){
        $rand = $col_ranges['B'][rand ( 0 , 14 )]; // calls to an array of number
        if(!in_array($rand, $col_B)){
            $col_B[$i] = $rand; 
          break;
        }
        else{ continue;}
      }
    
    }
    echo implode($col_B, '<br>');
    

    【讨论】:

    • 完美!这正是我想要的。谢谢!!
    • 它会完成这项工作。但它并不是最优的,因为它可能会循环很多次,虽然很容易找到一个解决方案,它可以在 5 次迭代中找到唯一值。
    猜你喜欢
    • 1970-01-01
    • 2018-03-06
    • 2018-02-15
    • 1970-01-01
    • 2014-10-17
    • 2018-05-15
    • 2018-04-27
    • 2018-10-28
    • 2018-12-20
    相关资源
    最近更新 更多