数组比较检查

时间:2013-01-02 09:17:03

标签: php logic

我有2个阵列:

第一个:

$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是否至少有一个实例。

我的比较代码我试过..

$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)时,我得到了很多错误,所以即使播放器包含所有正确的键,关闭比较会破坏代码并返回false。

任何有关此比较逻辑的帮助都非常好,如果您需要更多详细信息,请告诉我们。

2 个答案:

答案 0 :(得分:0)

答案是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 :(得分:0)

你原来的逻辑很好。你犯了两个错误:

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

    <?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的键检查值。当你开始用trues填充$ check时,你的内部循环会运行得更快。

    或者如果你的内循环很长,你可以考虑对它进行排序,以便搜索变得更快。我缺少一个内置的二进制搜索功能或PHP没有内置的;你可能需要从某个地方剪切并粘贴它。

    或者如果没有优化,至少通过对“in_array”等函数的单次调用来消除内部循环。