不确定如何正确访问数组以比较数据?

问题描述:

我在下面创建了一个函数。不确定如何正确访问数组以比较数据?

我无法上班的部分是在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); 

不需要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

看看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

声明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