Gibt es eine bequeme Methode, mit der ich zwei Lehren verketten kann ArrayCollection()
? etwas wie:
$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 }
Ich möchte nur wissen, ob ich es mir ersparen kann, die 2. Sammlung zu durchlaufen und jedes Element einzeln zur 1. Sammlung hinzuzufügen.
Vielen Dank!
php
symfony
doctrine-orm
arraycollection
Throoze
quelle
quelle
Antworten:
Bessere (und funktionierende) Variante für mich:
$collection3 = new ArrayCollection( array_merge($collection1->toArray(), $collection2->toArray()) );
quelle
Sie können einfach tun:
$a = new ArrayCollection(); $b = new ArrayCollection(); ... $c = new ArrayCollection(array_merge((array) $a, (array) $b));
quelle
toArray()
. Sehen Sie, was passiertWenn Sie Duplikate verhindern müssen, kann dieses Snippet hilfreich sein. Für die Verwendung mit PHP5.6 wird ein variabler Funktionsparameter verwendet.
/** * @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; }
Könnte in einigen Fällen nützlich sein.
quelle
$collection3 = new ArrayCollection(array_unique(array_merge($collection1->toArray(), $collection2->toArray())));
$newCollection = new ArrayCollection((array)$collection1->toArray() + $collection2->toArray());
Dies sollte schneller sein als
array_merge
. Doppelte Schlüsselnamen von$collection1
werden beibehalten, wenn derselbe Schlüsselname in vorhanden ist$collection2
. Egal wie hoch der tatsächliche Wert istquelle
toArray()
Gibt ein Array zurück, sollten Siearray
sicher keinen anderen Tipp eingeben müssen ?$collection->toArray()
zurückkehrtnull
oderfalse
. Sie erhalten einen schwerwiegenden Fehler.Sie müssen die Sammlungen noch durchlaufen, um den Inhalt eines Arrays einem anderen hinzuzufügen. Da es sich bei der ArrayCollection um eine Wrapper-Klasse handelt, können Sie versuchen, die Arrays von Elementen unter Beibehaltung der Schlüssel zusammenzuführen. Die Array-Schlüssel in $ collection2 überschreiben alle vorhandenen Schlüssel in $ collection1 mithilfe einer der folgenden Hilfsfunktionen:
$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; }
quelle
&
Betreiber? ist es so etwas wie in C? Nun, natürlich ist dies eine Lösung, aber das Verhalten, das ich erwartet hatte, bestand darin, eine zu haben,ArrayCollection
die bereits einige Werte enthielt, und eine Methode (vonArrayCollection
, falls vorhanden, oder eine isolierte Prozedur wie Ihre) zu verwenden, um die Werte einer anderen vorhandenen hinzuzufügenArrayCollection
. Ihre Lösung erfordert die Erstellung einer neuenArrayCollection
, was den Prozess schwer macht. Danke trotzdem!Fügen Sie einem Array eine Sammlung hinzu, basierend auf Yury Pliashkous Kommentar (ich weiß, dass die ursprüngliche Frage nicht direkt beantwortet wird, aber diese wurde bereits beantwortet, und dies könnte anderen helfen, hier zu landen):
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; }
Vielleicht gefällt es dir ... vielleicht auch nicht ... Ich habe nur daran gedacht, es rauszuwerfen, falls jemand es braucht.
quelle
Beachtung! Vermeiden Sie große Verschachtelungen rekursiver Elemente. array_unique - hat eine rekursive Einbettungsgrenze und verursacht a
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);
quelle
Verwenden von 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
quelle
echo $a.toArray();
wird sicherlich einen Fehler auslösen, datoArray
es sich nicht um eine gültige Funktion handelt. Es muss mindestens seinecho $a->toArray();
. Außerdem sollte die Ausgabe am Ende als Code formatiert sein.