2013-01-02 118 views
0

我有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。

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

+0

不是array_intersect()函数给你这个吗? –

+0

我将如何去使用它? '$ result = array_intersect($ array1,$ array2); if($ result){// do this}'? –

+0

http://php.net/array_intersect –

回答

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; 
0

你原来的逻辑大约是不错的。你犯了两个错误:

  1. 你忘了打出来的循环上遇到的真实情况,从而使循环继续,并将$检查,以虚假的下一个迭代,这将导致$不必要的膨胀检查。
  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的键检查值。当你开始用trues填充$ check时,你的内部循环运行速度会快得多。

或者如果你的内循环比较长,你可以考虑对它进行排序,以便搜索变得更快。我缺少一个内置的二进制搜索功能或PHP没有内置的;你可能需要从某处剪切并粘贴。或者如果不进行优化,至少用一次调用函数(比如'in_array')就可以消除内部循环。