数组比较检查

  • 本文关键字:比较 数组 php logic
  • 更新时间 :
  • 英文 :


我有两个数组:

第一:

$array1 = ("Key 1","Key 2","Key 3"); //is dynamic, so can range from 1 => many values

第二个数组是一个基于数据库的值,它将返回一个基于玩家在库存中拥有多少按键的数组。

$array2 = ("Key 1","Key 1","Key 2","Key 3","Key 3","Key 3") //in this case, the player DOES have all the keys.

我的问题是,我无法找出适当的逻辑来比较这些数组,看看$array2是否在$array1中至少有一个实例。

My comparison code I try ..

$check = array();
while ($k = mysql_fetch_array($array2)) {
    foreach ($array1 as $name) {
    if ((string)$name == (string)$k['name']) $check[] = true;
    else $check[] = false;
    }
}
foreach ($check as $bool) {
    if ($bool == false) {
        $return = false;
    } else {
    $return = true;
    }
}
return $return;

问题是,当我print_r($check),我得到许多假,所以即使播放器包含所有正确的键,关闭比较打破了代码,它返回假。

这个比较逻辑的任何帮助将是优秀的,如果你需要更多的细节,请告诉我。

这个问题的答案是in_array(),这是我用来解决它的算法(感谢你们的帮助)

while ($k = mysql_fetch_array($pkey)) { //turn returned list of player items into a new array
    $new_pkey[] = $k['name'];
}
foreach ($key as $name) { //search new array using the set list required to pass the check
    if (in_array($name,$new_pkey)) $check[] = true;
    else $check[] = false;
}
foreach ($check as $bool) { //search the check array to see if it contains a false. If so, break and return false
    if ($bool == false) {
        $return = false;
        break; //crucial bug -- would return true unless the last element was false. This lets any element be false and finally yield false
    } else {
        $return = true;
    }
}
return $return;

你原来的逻辑是关于好的。你犯了两个错误:

  1. 您忘记在遇到true条件时跳出循环,因此循环继续并在下一次迭代时将$check设置为false,并且这会导致不必要的$check膨胀。
  2. 您过早地将$check设置为false;未来的匹配条件将翻转数组中另一个位置的位,而之前的不匹配将已经将位设置为false。

试试这个:

<?php
$check = array();
foreach ($array1 as $name) {
    $check[$name] = false;
}
while ($k = mysql_fetch_array($array2)) {
    foreach ($array1 as $name) {
    if ((string)$name == (string)$k['name'])
    {
        $check[$name] = true;
        break;
    }
    }
}
foreach ($check as $bool) {
    if ($bool == false) {
    $return = false;
    } else {
    $return = true;
    }
}
return $return;
?>

然后你也可以做一些优化。与比较从DB读取的每个值与$array1中的每个值不同,您可以仅针对$check数组中为false的键检查这些值。当您开始用true填充$check时,您的内循环将运行得更快。

或者如果你的内部循环比较长,你可以考虑对它进行排序,这样搜索就会更快。我错过了一个内置的二进制搜索功能或PHP没有一个内置;你可能需要从某个地方剪切粘贴它。

或者如果不优化,至少通过调用函数(如'in_array')来取消内部循环。

相关内容

  • 没有找到相关文章

最新更新