web-dev-qa-db-fra.com

Comment fusionner deux php Doctrine 2 ArrayCollection ()

Existe-t-il une méthode pratique qui me permette de concaténer deux Doctrine ArrayCollection()? Quelque chose comme:

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

Je veux juste savoir si je peux me sauver en itérant sur la 2ème collection et en ajoutant chaque élément un par un à la 1ère collection.

Merci!

73
Throoze

Meilleure variante (et fonctionnelle) pour moi:

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

Vous pouvez simplement faire:

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

Si vous devez empêcher les doublons, cet extrait peut vous aider. Il utilise un paramètre de fonction variadic pour une utilisation avec 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;
}

Peut être utile dans certains cas.

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

Cela devrait être plus rapide que array_merge. Noms de clés en double de $collection1 sont conservés lorsque le même nom de clé est présent dans $collection2. Quelle que soit la valeur réelle

2
kanariezwart

Basé sur Yury Pliashko commentaire de:

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

Peut-être que vous l'aimez ... peut-être pas ... J'ai juste pensé à le jeter juste au cas où quelqu'un en aurait besoin.

1
Manatax

Vous devez toujours parcourir les collections pour ajouter le contenu d'un tableau à un autre. Comme ArrayCollection est une classe wrapper, vous pouvez essayer de fusionner les tableaux d'éléments tout en conservant les clés, les clés de tableau dans $ collection2 remplacent toutes les clés existantes dans $ collection1 en utilisant une fonction d'assistance ci-dessous:

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