如何限制数组中的重复值

时间:2017-07-03 17:12:18

标签: php arrays

首先,我为我缺乏英语而道歉。我希望你能理解我在这里要解释的内容。

所以基本上我需要构建一个限制数组内重复值数量的函数。

我需要这样做的原因是我建立了一个将数字分成组的系统,每个组都必须具有相同数量的数字。

编辑:随机数代表组号。

我已经编写了一个函数来执行此操作但由于某种原因,它无法正常工作。

function jagaTiimid($max, $liiget, $tArvLength, $tArv){
      $tiimid = []; //Starting array
      for($z=0;$z<$liiget;$z++){
          $numbers = [];
          $rn = randomNumber($tArvLength, $tArv, $numbers); //Generate a random number for a group, etc group 1, group 2, group 3 
          $mitu = countInArray($tiimid, $rn); //Check how many times that number has occured in array
          if($mitu == $max){ //If it equals to maximum number of times then... 
             $rnUus = randomNumber($tArvLength, $tArv, $numbers); //generate a new random number
             while($rnUus == $rn){
               $numbers = [];
               $rnUus = randomNumber($tArvLength, $tArv, $numbers);
             } //loop until the new generated number doesn't equal to old rn.
             $tiimid[] = $rnUus; //if it doesn't equal to $rn then push into array
          }else{
             $tiimid[] = $rn;
          }
      }
      return $tiimid;
}

由于某种原因,这个数字仍然比预想的要多。

基本上它不应该结束的是。

https://api.jquery.com/on/

正如您所看到的,一组(组2)发生的次数多于其他组,但两组之间应该相同。

编辑:CountInArray();

function countInArray($array, $what) {
  $count = 0;
  for ($i = 0; $i < count($array); $i++) {
      if ($array[$i] === $what) {
          $count++;
      }
  }
  return $count;
}

2 个答案:

答案 0 :(得分:1)

当第一个随机选择击中已经使用$liiget次的数字时,内部循环开始,但它不检查新生成的随机数是否已经$liiget次。

为了提高效率,我会跟踪一个号码的使用次数。此外,如果确实没有任何数字不会超过最大重现次数,您可以从安全网中受益。

没有必要使用嵌套循环。代码如下所示:

function jagaTiimid($max, $liiget, $tArvLength, $tArv){
    $tiimid = []; //Starting array
    $counts = []; // Helper for quick count
    $tries = 0; // Counter to avoid infinite looping
    while (count($tiimid) < $liiget && $tries++ < 100) {
        $numbers = [];
        $rn = randomNumber($tArvLength, $tArv, $numbers); //Generate a random number for a group, etc group 1, group 2, group 3 
        if (!isset($counts[$rn])) $counts[$rn] = 0; // initialise on first occurence
        if ($counts[$rn] < $max) {
            $tiimid[] = $rn; // add it to the result
            $counts[$rn]++; // ... and adjust the count
            $tries = 0; // reset the safety
        }
    }
    return $tiimid;    
}

答案 1 :(得分:0)

用while替换while($ rnUus == $ rn)(countInArray($ tiimid,$ rnUus)&gt; = $ max) - 伊利亚·布尔索夫