88

2つの教義を連結できる便利な方法はあります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つずつ追加する手間を省くことができるかどうかを知りたいだけです。

ありがとう!

4

8 に答える 8

182

私にとってより良い(そして機能する)バリアント:

$collection3 = new ArrayCollection(
    array_merge($collection1->toArray(), $collection2->toArray())
);
于 2013-06-01T10:09:41.847 に答える
13

あなたは簡単に行うことができます:

$a = new ArrayCollection();
$b = new ArrayCollection();
...
$c = new ArrayCollection(array_merge((array) $a, (array) $b));
于 2012-04-10T14:16:23.823 に答える
11

重複を防ぐ必要がある場合は、このスニペットが役立つ場合があります。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;
}

場合によっては便利かもしれません。

于 2015-09-06T21:12:13.963 に答える
3
$newCollection = new ArrayCollection((array)$collection1->toArray() + $collection2->toArray()); 

これはより高速である必要がありますarray_merge$collection1に同じキー名が存在する場合、からの重複キー名が保持され$collection2ます。実際の値に関係なく

于 2014-12-10T10:53:28.290 に答える
2

ある配列の内容を別の配列に追加するには、コレクションを反復処理する必要があります。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;
}
于 2012-04-10T05:25:25.470 に答える
0

Yury Pliashkouのコメントに基づいて、コレクションを配列に追加します(元の質問に直接回答していないことはわかっていますが、すでに回答済みであり、他の人がここに着陸するのに役立つ可能性があります)。

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

多分あなたはそれが好きかもしれません...多分そうではありません...私は誰かがそれを必要とする場合に備えてそれをそこに捨てることを考えました。

于 2014-08-28T23:51:50.263 に答える
0

注意!再帰要素の大きなネストは避けてください。array_unique-再帰 な埋め込み制限があり、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);
于 2019-11-08T08:11:36.560 に答える
-1

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
于 2015-10-20T15:14:27.663 に答える