不知道如何正确访问数组以比较数据



我在下面创建了一个函数。

我无法工作的部分是在is_arrayif语句中检查if $generatedkey == $key

它总是直接进入else语句,这意味着即使在我的示例数组中,密钥也不匹配。我想我可能在foreach循环中没有正确访问数组,因此它从不匹配,但不确定如何解决它。我确实用echo替换了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&而循环。只需使用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;
}
}

看看foreach是如何工作的。应为:

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

语句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始终是一个数组:

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);
}

就像另一个一样,如果在$userdbkey中发现重复,则返回true,如果没有,则返回false。它可以用同样的方式调用。

最新更新