2017-06-05 42 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