2つの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 }
2番目のコレクションを反復処理し、各要素を1番目のコレクションに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
からの重複キー名は保持されます。実際の値が何であっても
Yury Pliashko のコメントに基づく:
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;
}
多分あなたはそれが好きかもしれません...多分そうではありません...私はちょうど誰かがそれを必要とする場合に備えてそこにそれを捨てることを考えました。
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;
}