2017-02-11 82 views
1

我在下面創建了一個函數。不確定如何正確訪問數組以比較數據?

我無法上班的部分是在is_arrayif聲明中檢查if $generatedkey == $key時。

它總是直接進入else聲明,這意味着即使在我的示例數組中,密鑰不匹配,但密鑰不匹配。我想我可能沒有在foreach循環中正確地訪問陣列,因此它永遠不會匹配,但不知道如何解決它。我確實用回聲代替return進行測試,並總是如上所述去else

下面代碼中的測試數組實際上是數據庫的結果,它將作爲數組提取,但爲了測試目的,我創建了一個測試數組($userdbkey)。

# check if activation key already exists if so regenerate a new 
# one because activation keys are unique 
function activationkeydupcheck($generatedkey, $userdbkey) { 

    if(is_array($userdbkey)){ 
     foreach($userdbkey as $key){ 
      $key; 
     } 
     if($generatedkey == $key){ 
      while($generatedkey == $key){ 
       // generate a new key 
       return $activationkeygenerator = activationkeygenerator(); 
      } 
     } else { 
      // else use original key as it's unique (ie not found in db) 
      return $activationkeygenerator = $generatedkey; 
     } 

    } else { // not an array 
     if($generatedkey == $userdbkey){ 
      while($generatedkey == $userdbkey){ 
      // generate a new key 
      return $activationkeygenerator = activationkeygenerator(); 
      } 
     } // else use the original as it's unique (ie not found in db) 
     return $activationkeygenerator = $generatedkey; 
    } 
} 
// for testing it's static, but in my script it will be auto generated by a a function that generates activation keys. 
$generatedkey  = 'g5kfjgh84hf5jk219fthjvmcd34tu79ldjhgnbmv1'; 
//$userdbkey  = 'g5kfjgh84hf5jk219fthjvmcd34tu79ldjhgnbmv1'; 

// for testing i made this test array but in my script it will be comparing against keys in a database which will be fetched as an array. 
$userdbkey  = array(
        'g5kfjgh84hf5jk219fthjvmcd34tu79ldjhgnbmv1', 
        'g5kfjgh84hf5jk219fthjvmcd34tu79ldjhgnbmv2', 
        'g5kfjgh84hf5jk219fthjvmcd34tu79ldjhgnbmv3', 
        'g5kfjgh84hf5jk219fthjvmcd34tu79ldjhgnbmv4', 
        'g5kfjgh84hf5jk219fthjvmcd34tu79ldjhgnbmv5', 
        'g5kfjgh84hf5jk219fthjvmcd34tu79ldjhgnbmv6', 
        'g5kfjgh84hf5jk219fthjvmcd34tu79ldjhgnbmv7', 
        'g5kfjgh84hf5jk219fthjvmcd34tu79ldjhgnbmv8',     
        ); 

activationkeydupcheck($generatedkey, $userdbkey); 

回答

1

不需要foreach & while循環。只要使用PHP函數和tenary操作來簡化你的函數:

function activationkeydupcheck($generatedkey, $userdbkey) { 
    if(is_array($userdbkey)){ 
    return in_array($generatedkey, $userdbkey) ? activationkeydupcheck(activationkeygenerator(), $userdbkey) : $generatedkey; 
    } else { // not an array 
    return $generatedkey == $userdbkey ? activationkeydupcheck(activationkeygenerator(), $userdbkey) : $generatedkey; 
    } 
} 
+0

嗨@Rob我以爲我需要while循環,因爲如果$ generatedkey不斷生成已經存在的密鑰,我會希望它繼續生成一個,直到找到唯一的密鑰?謝謝 – PHPLOVER

+0

如果你想回復關於while循環,進一步尋找我認爲你現在可能是最好的答案,所以如果你能回答上面我會很感激,因爲我想現在可能已經接受了錯誤的答案。謝謝。我是否需要在while循環中調用函數actionkeydupcheck()時檢查生成的鍵是否已經存在,或者只是調用函數? – PHPLOVER

+0

,因爲我需要它繼續生成一個新的密鑰,直到找到一個唯一的密鑰,因此我的問題需要while循環。謝謝 – PHPLOVER

1

看看foreach是如何工作的。 應該是:

foreach($userdbkey as $key){ 
     $key; // u are doing nothing here   
    if($generatedkey == $key){ 
     while($generatedkey == $key){    
      return $activationkeygenerator = activationkeygenerator(); 
     } 
    } else { 
     return $activationkeygenerator = $generatedkey; 
    } 
} 
+0

非常感謝@馬特,我現在可以看到我做錯了什麼,它是如此愚蠢的我沒有注意到這個錯誤,雖然我在W3Schools的去理解foreach循環我仍然錯了,非常感謝你的幫助。現在所有作品都很好。 – PHPLOVER

1

聲明if(is_array($userdbkey)){是檢查數組正確。如果它不是真的,請嘗試使用print_r($userdbkey)exit來查看發生了什麼,因爲我沒有看到任何問題。

至於你的功能代碼,這裏是一個帶有註釋的清理版本。我修改了它,以便在找到重複的情況下返回true,否則返回false,因爲您試圖強制使用唯一的ID。

function activationkeydupcheck($generatedkey, $userdbkey) { 
    if(is_array($userdbkey)){ 
     foreach($userdbkey as $key){ 
      if($generatedkey == $key){ 
       // Found duplicate 
       return true; 
      } 
     } 
    } else { // not an array 
     if($generatedkey == $userdbkey){ 
      // Found duplicate 
      return true; 
     } 
    } 

    // No duplicates 
    return false; 
} 

然後你就可以調用它像這樣:

// While this is true (duplicates are found), change the key 
while(activationkeydupcheck($generatedkey, $userdbkey)) { 
    $generatedkey = activationkeygenerator(); 
} 

在你的原代碼,聲明while($generatedkey == $key)將永遠循環下去,因爲$generatedkey從來沒有在循環內改變。但是,您只需返回一個在第一個循環中立即停止執行的新鍵。所以你的重複檢查器會返回新的密鑰,並繼續不去檢查那個密鑰。

,如果你喜歡更小的行不一樣多,只是迫使$userdbkey始終是一個數組:如果重複在$userdbkey發現

function activationkeydupcheck($generatedkey, $userdbkey) { 
    // If this isn't an array, make it one 
    if(!is_array($userdbkey)) { 
     // Same as $userdbkey = array($userdbkey) 
     $userdbkey = [$userdbkey]; 
    } 

    return in_array($generatedkey, $userdbkey); 
} 

就像另外一個,這個返回true,如果不是,則爲false它可以以相同的方式調用。

+0

嗨@CaptainHypertext我以爲我需要while循環仍然是因爲如果$ generatedkey不斷生成已經存在的密鑰,我希望它繼續生成一個,直到找到一個唯一的密鑰? – PHPLOVER

+1

我看到了,我更新了我的答案。 –

+1

非常感謝,我接受你的回答,因爲不僅你回覆了評論,但你提供了一個很好的解決方案,並提供了很好的解釋並解釋了爲什麼我不需要while循環,你的代碼也幫助我改進零件我的其他代碼,所以這就是爲什麼我接受你作爲答案和解決方案。非常感謝您的幫助。非常感謝。祝你今天愉快! – PHPLOVER