2013-01-02 116 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')就可以消除內部循環。