2010-11-16 28 views
1

我有一個類:有值的遊戲。檢查PHP中同一個實例的值

我有兩個遊戲實例的數組。現在我需要比較這兩個數組在遊戲實例中的相同值。

遊戲類有屬性: homeId visitingId

現在我需要在兩個數組檢查相同的值(它們是大,100多個遊戲實例)

我要做的就是:

foreach ($games1 as $game1) { 
foreach ($games2 as $game2) { 
    if (($game1->getHomeId() == $game2->getHomeId()) && ($game1->getVisitingId() == $game2->getVisitingId())) { 
    //Games are the same 
    } 
} 
} 

這需要時間,有沒有辦法做得更快?

+0

除了更快,爲了什麼目的?一旦你發現它們是相同的,你會怎麼做。 – Gordon 2010-11-16 16:31:01

+0

我會將它們顯示爲匹配,否則它們將顯示爲新遊戲。 – baklap 2010-11-16 17:06:14

+0

這些實際上是相同的對象實例還是它們恰好具有相同的值? – Gordon 2010-11-16 18:02:26

回答

0

我得到它運行,但它的髒我覺得。

起初我將這些實例存儲在一個散列表中,這個散列是由visitorId和homeId構成的。

然後我創建了其他遊戲陣列的visitorId和homeId的散列。

然後我使用$ table [$ hash]檢索實例。

我曾經擁有的數組在長度上並不相同,所以這是有效的。我不知道這裏是不是太髒,但它的工作原理:P

foreach($pGames as $pGame) { 
    $hash = $pGame->getHomeId() . '-' . $pGame->getVisitingId(); 
     $table[$hash] = $pGame; 
} 
foreach($games as $game) { 
    $hash = $game->getHomeId() . '-' . $game->getVisitingId(); 
    $pGame = $table[$hash]; 
    if($pGame instanceof Game) { 
     //use the instance 
    } 
} 
0

您正在進行大量冗餘計算。使用for循環,而不是一個foreach循環,在你離開的地方開始,而不是在開頭:

$games1_count = count($games1); 
$games2_count = count($games2); 

for($i=0; $i < $games1_count; $i++) { 
    $game1 = $games1[$i]; 
    for($j=$i; $j < $games2_count; $j++) { 
     $game2 = $games2[$j]; 
     if (($game1->getHomeId == $game2->getHomeId()) && $game1->getVisitingId == $game2->getVisitingId()) { 
      //Games are the same 
     } 
    } 
} 

這將提供一個非常顯著的速度提升。它不會減少問題的順序,但會減少一半的計算量。

編輯

您也應該考慮某種形式的索引。當您填充$game1,例如,創建一個存儲的值遊戲的數組:

$game_index = array(
    "home_id"=array(
     "id1"=>$reference_to_game_with_id1, 
     "id2"=>$reference_to_game_with_id2 
    ), 
    "visiting_id"=array(
     "id1"=>$reference_to_game_with_visiting_id1, 
     "id2"=>$reference_to_game_with_visiting_id2 
    ) 
); 
+0

這是假設'$ games1'和'$ games2'是相同的數組(或者至少索引和排序相同)...如果它們不同,我不確定這種優化是否可行... – ircmaxell 2010-11-16 16:36:46

1

您目前的解決方案的複雜度爲O(n * n)。有可能將其降至O(nlogn)。爲此,您必須對兩個數組進行排序,然後進行比較。我會做這樣的事情:

$t1=array(); 
foreach ($games1 as $key=>$game1) { 
    $t1[$key]=$game1->getHomeId; 
} 
asort($t1); 
$t2=array(); 
foreach ($games2 as $key=>$game2) { 
    $t2[$key]=$game2->getHomeId(); 
} 
asort($t2); 
$el1=each($t1); 
$el2=each($t2); 
do{ 
    if ($el1['value']<$el2['value']) 
    $el1=each($t1); 
    elseif ($el1['value']>$el2['value']) 
    $el2=each($t2); 
    elseif($games1[$el1['key']]->getVisitingId == $games2[$el2['key']]->getVisitingId()) 
    //game are the same 

}while($el1 !== false && $el2 !== false) 

這產生了相當大的開銷,所以對於少量的數據,它會工作得更慢。然而,數組中的數據越多,該算法的效率就越高。