2017-06-05 38 views
0

我试图建立一个函数,它将检查针是干草堆,如果是那么函数应循环,直到没有。循环功能,直到没有指定的针在干草堆中

到目前为止,我已经构建了一个随机数生成函数。那个函数做的是创建一个随机字符串,然后用sha512对其进行哈希处理。该函数然后从字符串中提取所有数字并将其乘以2.

它使我留下一长串数字,然后我将使用mt_rand指定strpos的开始和结束点。之后,我只是返回随机创建的数字。

function randomNumber($suurus, $max){ 
mb_internal_encoding("UTF-8"); 
$possible="aábcdeéfghiíjklmnoóöópqrstuúüűvwxyzAÁBCDEÉFGHIÍJKLMNOÓÖŐPQRSTUÚVWXYZ"; 
$char = mb_substr($possible,rand(0, mb_strlen($possible) - 1),1); 
$str = openssl_digest($char, 'sha512'); 
$str = preg_replace('/[^1-9.]+/', '', $str); 
$str = $str*2; 
$strLen = strlen($str)-5; 
$strStart = mt_rand(1, $strLen); 
$strEnd = mt_rand(1, $suurus); 
$str = substr($str, $strStart, $strEnd); 
while($str > $max){ 
    $str = $str/2; 
} 
return round($str); 

事情是,这个数字不能重复,我需要它在任何时候都是唯一的,我的应用程序。

我实际上完成了我想要的if else语句,但这意味着我必须编写一个重复if语句的长文字,直到我得到我想要的结果。我真的不认为这是做事的最聪明的方式。

if(!isset($voitjad)){ 
         $voitjad[$vCounter][] = array(
         'nimi' => $voitja, 
         'auhind' => $keyCode['v'.$vCount.''], 
         'rn' => $rN, 
         'siin' => 1, 
         'id' => $voitjaID 
        ); 
        }else{ 
         if(!exist($rN, $voitjad)){ 
         $voitjad[$vCounter][] = array(
          'nimi' => $voitja, 
          'auhind' => $keyCode['v'.$vCount.''], 
          'rn' => $rN, 
          'siin' => 1, 
          'id' => $voitjaID 
         ); 
         }else{ 
          $rN = randomNumber($atLength, $atCount); 
          $voitja = $attendcheckfb['attending'][$rN]['name']; 
          $voitjaID = $attendcheckfb['attending'][$rN]['id']; 
          if(!exist($rN, $voitjad)){ 
          $voitjad[$vCounter][] = array(
           'nimi' => $voitja, 
           'auhind' => $keyCode['v'.$vCount.''], 
           'rn' => $rN, 
           'siin' => 2, 
           'id' => $voitjaID 
          ); 
          }else{ and so on.... 

我也试图与do-while循环,但我不能真正得到它的工作,我不知道究竟我在做什么错在这里。如果你能教育我,请给我提供信息。

$nimed = array_values($nimed); 
         $voitja = $nimed[$rN]['name']; 
         $voitjaID = $nimed[$rN]['id']; 
         $voitjad[$vCounter][] = array(
         'nimi' => $voitja, 
         'auhind' => $keyCode['v'.$vCount.''], 
         'rn' => $rN, 
         'siin' => 1, 
         'id' => $voitjaID 
        ); 
         $oitjaCount++; 
         $rN = randomNumber($nimedLength, $nimedCount); 
        } while(!exist($rN, $voitjad)); 

如果有,我得到更好的随机生成的数字的方式,那么请告诉我,我很开放的建议。同时我需要这个针,干草堆的帮助。

+2

使用递归函数。 – Chris

+0

好吧,我会谷歌它是什么时候。 – drpzxc

+0

@drpzxc一个调用自身的函数。所以,如果你没有得到想要的结果,只需重新调用函数即可。 – Daniel

回答

1

您可以使用一个循环做到这一点:

function get_unique_hashcode() { 
    global $hash_array; 
    do { 
     $hashcode = make_random_hashcode(); 
    } while (in_array($hashcode, $hash_array)); 
    $hash_array[] = $hashcode; 
    return $hashcode; 
} 

或者你可以用递归做到这一点:

function get_unique_hashcode() { 
    global $hash_array; 
    $hashcode = make_random_hashcode(); 
    if (in_array($hashcode, $hash_array)) { 
     return get_unique_hashcode(); 
    } else { 
     $hash_array[] = $hashcode; 
     return $hashcode; 
    } 
} 

这只是一个一般的结构,你可能需要调整它为您详细的需求。

+0

我不能完全测试这个权利知道,它似乎应该工作,但我会给我的投票后,我已经测试它。 – drpzxc

+0

我现在明白为什么我的while循环不能按我的预期工作。我现在知道递归函数,你一直很好。谢谢。 – drpzxc