Как слить две php Doctrine 2 ArrayCollection ()

Есть ли удобный метод, который позволяет мне ArrayCollection() две Doctrine 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 } 

Я просто хочу знать, могу ли я спасти меня от повторения второй коллекции и добавить каждый элемент по одному в 1-ю коллекцию.

Благодаря!

Для меня лучший (и рабочий) вариант:

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

Вы можете просто сделать:

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

Если вам необходимо предотвратить дублирование, этот фрагмент может помочь. Он использует параметр вариационной функции для использования с 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; } 

В некоторых случаях может быть удобно.

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

Это должно быть быстрее, чем array_merge . Дублированные имена ключей из $collection1 сохраняются, когда в $collection2 присутствует такое же ключевое имя. Независимо от того, какова фактическая стоимость

Вам все равно нужно перебирать коллекции, чтобы добавить содержимое одного массива в другое. Поскольку 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; } 

Основываясь на комментарии Юрия Плишкова :

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

Может быть, тебе это нравится … может быть, нет … Я просто подумал о том, чтобы выбросить его на случай, если кому-то это понадобится.

Использование 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