2014-02-10 70 views
0

我在做什麼:將一個數組的值與數組中的其他對象進行比較。如果針中的某些對象屬性(我與其他對象進行比較的對象)與乾草堆中另一個對象中的相同屬性相匹配,則將針的某些屬性合併到乾草堆中的匹配對象並取消固定針。如何比較和取消設置數組中的對象與數組中的其他對象?

一些僞代碼:

<?php 
$haystack = array($obj1, $obj2, $obj3); 
if(!empty($haystack)){ 
    for($x=0;$x<count($haystack);$x++){ 
     if($haystack[$x]->prop1 == $haystack[$x+1]->prop1 && $haystack[$x]->prop2 == $haystack[$x+1]->prop2){ 
      $haystack[$x]->combined1 = $haystack[$x]->prop1.','.$haystack[$x+1]->prop1; 
      unset($haystack[$x+1]); 
     } 
    } 
} 
?> 
+0

你能在對象中實現一個'toArray'方法嗎?如果不是,則使用'(array)$ obj'將它們轉換爲數組,然後使用'array_intersect'來確定差異,如果有的話。 –

+0

@EliasVanOotegem做比較比較容易。我認爲這個問題與取消當前正在迭代的數組中的下一個元素有關。通過訪問$ array [$ x + 1],它將迭代器向前移動並搞亂比較(我認爲)。 – Chad

+0

將unset($ haystack [$ x + 1])'改爲'unset($ haystack [++ $ x])',這會增加'$ i',跳過下一個循環迭代的未設置索引 –

回答

1

擴大對我的評論一點點:

你必須改變unset($haystack[$x+1]);unset($haystack[++$x]);
如果說指數在0和1是相等的,您的當前循環將取消設置$haystack[1],將$i的值保留爲0,然後循環繼續以1(在此情況下爲1)遞增$i,並執行與$haystack[1]的比較,這剛剛被解除。
實際上遞增$i意味着,在該循環結束$i將爲1,而不是0,就可以增加一次,並圍繞下一次,環路將比較索引2和3

for ($x = 0, $max = count($haystack);$x <$max;++$x) 
{ 
    if ($haystack[$x] == $haystack[$x+1]) 
    {//only increment if you unset! 
     unset($haystack[++$x]); 
    } 
} 

這應該做的伎倆。如果你想給定數組中的所有元素進行比較,那麼你就必須要窩兩個循環:

for ($x = 0, $max = count($haystack);$x <$max;++$x, $max =count($haystack)) 
{//re-assign $max after inner loop completes, and reset keys 
    for ($j = $x+1;$j<$max;++$j) 
    { 
     if ($haystack[$x] == $haystack[$j]) 
     {//No need to increment again 
      unset($haystack[$j]); 
     } 
    } 
    $haystack = array_values($haystack);//this resets the keys 
} 

這應該解決您的問題

+0

比我以前更接近。似乎仍然有一個錯誤。如果我有一個4個物體的乾草堆,其中3個物體具有相同的prop1和prop2,我仍然收集3個物體而不是2個物體。 – Chad

+0

你必須使用嵌套循環,然後...如果你想比較數組的所有元素...我已經更新了我的答案 –

0

解決方案

 for($x=0;$x<count($haystack);$x++){ 
      for($y=0;$y<=count($haystack);$y++){ 
       if($haystack[$x]->prop1 == $haystack[$y]->prop1 && $haystack[$x]->prop2 == $haystack[$y]->prop2){ 
        if($haystack[$x]->prop3 == $haystack[$y]->prop3){ 
         continue; 
        }else{ 
         $haystack[$x]->prop1 .= $haystack[$y]->prop1; 
         unset($haystack[$y]); 
        } 
       } 
      } 
     } 

回顧,這是一個相當容易解決的問題。這個問題試圖在思維上保持迭代器的正確性,並知道需要多少個迭代器。爲了在不復制數組或使用中介的情況下工作,您只需實例化兩個迭代器即可同時遍歷數組,以便您可以比較$ array [0-n]$ array [0-n]而不是比較$ array [0-n]$ arrayCopy [0-n]