¿Existe algún método de conveniencia que me permita concatenar dos Doctrine ArrayCollection()? algo como:
$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 }
Solo quiero saber si puedo ahorrarme iterando sobre la segunda colección y agregando cada elemento uno por uno a la primera colección.
¡Gracias!
php
symfony
doctrine-orm
arraycollection
Throoze
fuente
fuente

Respuestas:
Mejor (y funcionando) variante para mí:
$collection3 = new ArrayCollection( array_merge($collection1->toArray(), $collection2->toArray()) );fuente
Simplemente puede hacer:
$a = new ArrayCollection(); $b = new ArrayCollection(); ... $c = new ArrayCollection(array_merge((array) $a, (array) $b));fuente
toArray(). Vea lo que sucedeSi se le solicita que evite los duplicados, este fragmento podría ayudar. Utiliza un parámetro de función variadic para su uso con 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; }Puede resultar útil en algunos casos.
fuente
$collection3 = new ArrayCollection(array_unique(array_merge($collection1->toArray(), $collection2->toArray())));$newCollection = new ArrayCollection((array)$collection1->toArray() + $collection2->toArray());Esto debería ser más rápido que
array_merge. Los nombres de clave duplicados de$collection1se mantienen cuando el mismo nombre de clave está presente en$collection2. No importa cuál sea el valor realfuente
toArray()devuelve una matriz, seguramente no debería necesitar escribir una sugerencia de otraarray?$collection->toArray()vuelvenullofalse. Terminas con un error fatal.Aún necesita iterar sobre las Colecciones para agregar el contenido de una matriz a otra. Dado que ArrayCollection es una clase contenedora, puede intentar fusionar las matrices de elementos mientras mantiene las claves, las claves de matriz en $ collection2 anulan cualquier clave existente en $ collection1 utilizando una función auxiliar a continuación:
$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; }fuente
&operador? es algo como en C? Bueno, por supuesto, esto es una solución, pero el comportamiento que esperaba era tener unArrayCollectionque ya contenía algunos valores, y usar un método (deArrayCollection, si existe, o un procedimiento aislado, como el suyo) para agregar los valores de otro existenteArrayCollection. Su solución requiere la creación de una nuevaArrayCollection, lo que dificulta el proceso. ¡Gracias de cualquier manera!Agregue una colección a una matriz, según el comentario de Yury Pliashkou (sé que no responde directamente a la pregunta original, pero eso ya fue respondido, y esto podría ayudar a otros a aterrizar aquí):
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; }Quizás te guste ... quizás no ... Solo pensé en tirarlo por si acaso alguien lo necesita.
fuente
¡Atención! Evite el gran anidamiento de elementos recursivos. array_unique : tiene un límite de incrustación recursivo y provoca un
PHP error Fatal error: Nesting level too deep - recursive dependency?/** * @param ArrayCollection[] $arrayCollections * * @return ArrayCollection */ function merge(...$arrayCollections) { $listCollections = []; foreach ($arrayCollections as $arrayCollection) { $listCollections = array_merge($listCollections, $arrayCollection->toArray()); } return new ArrayCollection(array_unique($listCollections, SORT_REGULAR)); } // using $a = new ArrayCollection([1,2,3,4,5,6]); $b = new ArrayCollection([7,8]); $c = new ArrayCollection([9,10]); $result = merge($a, $b, $c);fuente
Usando 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 6fuente
echo $a.toArray();seguramente arrojará un error, porquetoArrayno es una función válida. Debe ser al menosecho $a->toArray();. Además, la salida al final debe formatearse como código.