如何合并两个php Doctrine 2 ArrayCollection()

Thr*_*oze 76 php arraycollection symfony doctrine-orm

有没有方便的方法可以让我连接两个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 }
Run Code Online (Sandbox Code Playgroud)

我只是想知道我是否可以保存我迭代第二个集合并逐个添加每个元素到第一个集合.

谢谢!

pli*_*kou 154

对我来说更好(和工作)的变体:

$collection3 = new ArrayCollection(
    array_merge($collection1->toArray(), $collection2->toArray())
);
Run Code Online (Sandbox Code Playgroud)

  • 也许$ merged_arr = array_merge($ merged_arr,$ doct_collection-> toArray())? (5认同)

Dan*_*iro 13

你可以简单地做:

$a = new ArrayCollection();
$b = new ArrayCollection();
...
$c = new ArrayCollection(array_merge((array) $a, (array) $b));
Run Code Online (Sandbox Code Playgroud)

  • 虽然暴民的心态总是很有趣,但是你们中的任何一个人在贬低它之前是否真的试过这个?ArrayCollection实现了IteratorAggregate,它允许您将集合转换为数组,它将按预期工作. (21认同)
  • 我不明白为什么这会得到这么多的赞成.这完全是错的.将对象转换为数组不会调用`toArray()`.[看看会发生什么](http://www.php.net/manual/en/language.types.array.php#language.types.array.casting) (5认同)
  • 感谢上帝,有人聪明! (5认同)
  • @Lewis:派对有点晚了,但我回到了那个问题,是的,我试过了,不,它不起作用,因此是downvote. (2认同)

Mat*_*ock 8

如果您需要阻止任何重复,此代码段可能会有所帮助.它使用可变参数函数参数与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;
}
Run Code Online (Sandbox Code Playgroud)

在某些情况下可能会派上用场.

  • 或者使用`$collection3 = new ArrayCollection(array_unique(array_merge($collection1->toArray(), $collection2->toArray())));` (2认同)