2012-05-07 4 views
25

数学では、交点、差異、和集合(統一)の3つの操作があります。 PHPでは、私たちは配列で、この操作を行うことができます。PHPの配列の集合を設定する

  • 交差点:array_intersect
  • 違い:array_diff

何の機能は、労働組合のためにありますか?

array_intersectおよびarray_diffのような)結果配列に重複はありません。

インデックスが数値の場合、array_mergeは元の値を上書きしませんが、追加されます(PHP docs)。

答えて

45

array_mergeを試してみてください。一緒に

array_unique(array_merge($array1, $array2)); 

PHP Manual

+3

+1 for 'array_unique' – Sebastian

+2

なぜこれが受け入れられupvotedされているのか分かりません。組合オペレータについて何か不足していますか? – mwotton

+6

PHPの "共用体演算子"は、数学的な結合を実行しません。 var_dump([1,2] + [3,4])は[1,2,3,4]という数学的な和集合を持っていますが(4値のため)、2つの配列には2つの固有のキーしかないので、 [1,2]。 PHPの "union"演算子は数学的な連合と全く無関係です –

9

array_unique(array_merge(...))

5

使用array_uniquearray_merge

<?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); 
?> 

実行すると、このスクリプトは次のように出力します:PHP: Array Operatorsドキュメント内のコードから

4

 
Union of $a and $b: 
array(3) { 
    ["a"]=> 
    string(5) "apple" 
    ["b"]=> 
    string(6) "banana" 
    ["c"]=> 
    string(6) "cherry" 
} 
Union of $b and $a: 
array(3) { 
    ["a"]=> 
    string(4) "pear" 
    ["b"]=> 
    string(10) "strawberry" 
    ["c"]=> 
    string(6) "cherry" 
} 
+0

[PHP:Array Operators](http://php.net/manual/en)の[トップコメント](http://php.net/manual/en/language.operators.array.php#86379) /language.operators.array.php)documentation。 * "union演算子は一見すると思ったように振る舞いませんでした。値の配列ではなく、配列のキーに基づいて結合を実装しています。" *その後、array_unique(array_merge ($ a、$ b)) ' – icc97

+0

リンクを追加しましたが、PHPソースコードから直接コピー&ペーストする場合は、参照を追加する必要があります。 – icc97

0

+オペレータ:

$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

0

ちょうど$array1 + $array2 を使用すると、両方の配列が結合されます。

6

エイドリアンの答えはしません、必要な生成する2つの連番の配列から順番に番号が付け配列 - ここではいくつかのオプションます以下のとおりです。

array_values(array_unique(array_merge($array1, $array2))); 

(その後のキーをリナンバリングとエイドリアンの答え)

array_keys(array_flip($array1)+array_flip($array2)) 
は、

(キーに値を入れて、配列ユニオン演算子を使用)

array_merge($array1, array_diff($array2, $array1)) 

(合併前の二番目の配列から共通の価値観を削除)(私のシステムで長さ1000の二つの配列千回をマージする)

ベンチマーク結果:

  • ユニーク(エイドリアンのバージョン):2.862163066864秒
  • Values_Unique:3。12秒
  • Keys_Flip:2.34秒
  • がMerge_Diff:2.64秒

同じテストが、二つの配列は非常に類似していると(少なくとも80%の重複):

  • ユニーク(エイドリアンのバージョン):2.92秒
  • Values_Unique:3.15秒
  • Keys_Flip:1.84秒
  • Merge_Diff:2.36秒

実際の組合を行うためには、配列結合演算子を使用しているようですが、最速の方法です。ただし、array_flipは、配列の値がすべて文字列またはすべての整数である場合にのみ安全です。オブジェクトの配列の和集合を生成する必要がある場合は、array_mergearray_diffのバージョンをお勧めします。

4

"+"演算子を使用してください。リンクを参照してくださいArray Operators

+0

+演算子は...何かをしますが、それは間違いなく共用体ではありません。 (私はそれが鍵の組み合わせをすると思う?)。それが通常どんなことであろうと、あなたが思うほど有用ではありません。 – GordonM

+0

@ GordonM '+'演算子が配列共用体として定義されているので、扱いにくいです。あなたは鍵の組み合わせを行うことは間違いありませんが、[重複を削除するときには2番目の配列を選択します](https://softonsofa.com/php-array_merge-vs-array_replace-vs-plus-aka-union /)は 'array_merge'の反対です。 – icc97

+0

実際、この回答はhttp://stackoverflow.com/a/10485300/327074とhttp://stackoverflow.com/a/10485348/327074の複製です。 – icc97

1
$result = array_merge_recursive($first, $second); 

は、配列を内部に持つ配列を持つ場合に役立ちます。

関連する問題