数学では集合を使った 3 つの演算があります: 交差、差、和 (統一) です。PHP では、配列を使ってこの操作を行うことができます。
- 交差点:
array_intersect
- 違い:
array_diff
ユニオンにはどのような機能がありますか?
結果配列に重複を含めることはできません (array_intersect
や などarray_diff
)。
インデックスが数値の場合array_merge
、元の値は上書きされませんが、追加されます ( PHP docs )。
array_unique( array_merge( ... ) )
エイドリアンの答えは、2 つの連続番号付き配列から連続番号付き配列を生成する必要はありません。次のようなオプションがあります。
array_values(array_unique(array_merge($array1, $array2)));
(後でキーの番号を付け直したエイドリアンの答え)
array_keys(array_flip($array1)+array_flip($array2))
(値をキーに入れ、配列の結合演算子を使用します)
array_merge($array1, array_diff($array2, $array1))
(マージする前に、2 番目の配列から共有値を削除します)
ベンチマーク結果 (私のシステムで長さ 1000 の 2 つの配列を 1000 回マージした場合):
同じテストですが、2 つの配列が非常に似ています (少なくとも 80% 重複):
配列ユニオン演算子を使用して実際のユニオンを実行するのが最速の方法のようです。ただしarray_flip
、配列の値がすべて文字列またはすべて整数である場合にのみ安全であることに注意してください。オブジェクトの配列の結合を生成する必要がある場合は、 と を使用したバージョンをお勧めしarray_merge
ますarray_diff
。
そのためには「+」演算子を使用します。リンク配列演算子を参照してください
array_unique
と を併用array_merge
します。
PHP: Array Operatorsドキュメントのコードから:
<?php
$a = array("a" => "apple", "b" => "banana");
$b = array("a" => "pear", "b" => "strawberry", "c" => "cherry");
$c = $a + $b; // Union of $a and $b
echo "Union of \$a and \$b: \n";
var_dump($c);
$c = $b + $a; // Union of $b and $a
echo "Union of \$b and \$a: \n";
var_dump($c);
?>
実行すると、このスクリプトは次のように出力します。
$a と $b の結合: 配列(3) { ["あ"]=> string(5) "りんご" ["b"]=> string(6) "バナナ" ["c"]=> string(6) "チェリー" } $b と $a の結合: 配列(3) { ["あ"]=> string(4) "ナシ" ["b"]=> string(10) "ストロベリー" ["c"]=> string(6) "チェリー" }
$result = array_merge_recursive($first, $second);
内部に配列を持つ配列がある場合に役立ちます。
+
オペレーター:
$x[0] = 4;
$x[1] = 1;
$y[0] = 9;
$y[2] = 5;
$u = $y + $x;
// Results in:
$u[0] === 9;
$u[1] === 1;
$u[2] === 5;
$x + $y
!=に注意してください$y + $x
使用するだけ $array1 + $array2
で、両方の配列の結合が得られます。