2012-04-10 105 views
66

有沒有什麼方便的方法可以連接兩個Doctrine ArrayCollection()?像這樣:如何合併兩個PHP Doctrine 2 ArrayCollection()

$collection1 = new ArrayCollection(); 
$collection2 = new ArrayCollection(); 

$collection1->add($obj1); 
$collection1->add($obj2); 
$collection1->add($obj3); 

$collection2->add($obj4); 
$collection2->add($obj5); 
$collection2->add($obj6); 

$collection1->concat($collection2); 

// $collection1 now contains {$obj1, $obj2, $obj3, $obj4, $obj5, $obj6 } 

我只想知道,如果我可以救我迭代第二集合,並逐一添加到第一集合的每個元素。

謝謝!

+3

+1,因爲它是一個共同的,需要方法 – JavierIEH 2012-10-02 14:40:39

回答

129

更好的(和工作)變種我:

$collection3 = new ArrayCollection(
    array_merge($collection1->toArray(), $collection2->toArray()) 
); 
+0

最好的答案,毫無疑問。 – carles 2013-08-23 07:30:28

+0

我推薦這個解決方案 – loostro 2013-09-19 10:18:31

+0

我試圖做同樣的事情,但進入一個數組:array_merge($ merged_arr,$ doct_collection-> toArray());但沒有得到一個錯誤或它是否工作($ merged_arr是空的)。有任何想法嗎? – Guy 2013-10-20 18:34:50

1

您仍然需要遍歷集合以將一個數組的內容添加到另一個。由於ArrayCollection的是包裝類,你可以嘗試合併元件陣列,同時保持鍵,在$數組鍵collection2覆蓋使用下面的輔助功能在$ collection1任何現有的密鑰:

$combined = new ArrayCollection(array_merge_maintain_keys($collection1->toArray(), $collection2->toArray())); 

/** 
* Merge the arrays passed to the function and keep the keys intact. 
* If two keys overlap then it is the last added key that takes precedence. 
* 
* @return Array the merged array 
*/ 
function array_merge_maintain_keys() { 
    $args = func_get_args(); 
    $result = array(); 
    foreach ($args as &$array) { 
     foreach ($array as $key => &$value) { 
      $result[$key] = $value; 
     } 
    } 
    return $result; 
} 
+0

什麼是'&'運營商?這是像C中的東西嗎?當然這是一個解決方案,但是我期望的行爲是擁有一個已經包含一些值的'ArrayCollection',並且使用一個方法(如果存在'ArrayCollection',或者像你一樣的孤立過程)添加另一個現有的'ArrayCollection'的值。你的解決方案需要創建一個新的'ArrayCollection',這使得這個過程變得沉重。不管怎麼說,還是要謝謝你! – Throoze 2012-04-10 06:00:00

+0

由於您不想更改參數,所以&是通過引用傳遞。您可以重寫該方法以迭代集合。這種方法沒有任何參數,因此您可以根據需要組合任意數量的集合。 – 2012-04-10 06:05:41

+0

問題是,我動態獲取源集合,因此無法按照您的建議進行調用... – Throoze 2012-04-10 06:11:15

13

你可以簡單地這樣做:

$a = new ArrayCollection(); 
$b = new ArrayCollection(); 
... 
$c = new ArrayCollection(array_merge((array) $a, (array) $b)); 
+5

我不明白爲什麼會得到這麼多upvotes。這完全是錯誤的。將對象轉換爲數組不會調用'toArray()'。 [看看會發生什麼](http://www.php.net/manual/en/language.types.array.php#language.types.array.casting) – greg0ire 2013-06-13 14:45:51

+0

這不起作用 – 2013-09-20 07:28:18

+16

雖然小鬼的心態總是很有趣,在你投票之前,你們有沒有真的嘗試過這個? ArrayCollection實現了IteratorAggregate,它允許您將集合轉換爲數組,並且它將像預期的那樣工作。 – Lewis 2014-04-09 13:47:44

1

基於Yury Pliashkou的評論:

function addCollectionToArray($array , $collection) { 
    $temp = $collection->toArray(); 
    if (count($array) > 0) { 
     if (count($temp) > 0) { 
      $result = array_merge($array , $temp); 
     } else { 
      $result = $array; 
     } 
    } else { 
     if (count($temp) > 0) { 
      $result = $temp; 
     } else { 
      $result = array(); 
     } 
    } 
    return $result; 
} 

也許你喜歡它......也許不是......我只是想把它扔到那裏以防萬一有人需要它。

2
$newCollection = new ArrayCollection((array)$collection1->toArray() + $collection2->toArray()); 

這應該比array_merge更快。當$collection2中存在相同的密鑰名稱時,會保留$collection1中的重複密鑰名稱。無論實際價值是多少

+0

'toArray()'返回一個數組,你不應該需要鍵入另一個'數組'''當然? – Jimbo 2015-04-29 13:08:23

+0

@jimbo:你是對的,但如果因爲任何原因,第一個'$ collection-> toArray()'返回'null'或'false'。你最終會有一個致命的錯誤。 – kanariezwart 2016-10-31 09:47:48

+0

公平點 - 雖然如果教義未能轉換爲數組,那麼教義代碼庫就會出現嚴重錯誤;) – Jimbo 2016-10-31 11:28:29

7

如果您需要防止任何重複,此片段可能會有所幫助。它使用一個可變參數函數參數用於PHP5.6。

/** 
* @param array... $arrayCollections 
* @return ArrayCollection 
*/ 
public function merge(...$arrayCollections) 
{ 
    $returnCollection = new ArrayCollection(); 

    /** 
    * @var ArrayCollection $arrayCollection 
    */ 
    foreach ($arrayCollections as $arrayCollection) { 
     if ($returnCollection->count() === 0) { 
      $returnCollection = $arrayCollection; 
     } else { 
      $arrayCollection->map(function ($element) use (&$returnCollection) { 
       if (!$returnCollection->contains($element)) { 
        $returnCollection->add($element); 
       } 
      }); 
     } 
    } 

    return $returnCollection; 
} 

在某些情況下可能會得心應手。

0

使用Clousures PHP5> 5.3.0

$a = ArrayCollection(array(1,2,3)); 
$b = ArrayCollection(array(4,5,6)); 

$b->forAll(function($key,$value) use ($a){ $a[]=$value;return true;}); 

echo $a.toArray(); 

array (size=6) 0 => int 1 1 => int 2 2 => int 3 3 => int 4 4 => int 5 5 => int 6