不确定如何正确访问数组以比较数据?
我在下面创建了一个函数。不确定如何正确访问数组以比较数据?
我无法上班的部分是在is_array
if
声明中检查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;
}
}
看看foreach是如何工作的。 应该是:
foreach($userdbkey as $key){
$key; // u are doing nothing here
if($generatedkey == $key){
while($generatedkey == $key){
return $activationkeygenerator = activationkeygenerator();
}
} else {
return $activationkeygenerator = $generatedkey;
}
}
非常感谢@马特,我现在可以看到我做错了什么,它是如此愚蠢的我没有注意到这个错误,虽然我在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它可以以相同的方式调用。
嗨@Rob我以为我需要while循环,因为如果$ generatedkey不断生成已经存在的密钥,我会希望它继续生成一个,直到找到唯一的密钥?谢谢 – PHPLOVER
如果你想回复关于while循环,进一步寻找我认为你现在可能是最好的答案,所以如果你能回答上面我会很感激,因为我想现在可能已经接受了错误的答案。谢谢。我是否需要在while循环中调用函数actionkeydupcheck()时检查生成的键是否已经存在,或者只是调用函数? – PHPLOVER
,因为我需要它继续生成一个新的密钥,直到找到一个唯一的密钥,因此我的问题需要while循环。谢谢 – PHPLOVER