2つのアレイを組み合わせる


88

私はこのような2つの配列を持っています:

array( 
'11' => '11',
'22' => '22',
'33' => '33',
'44' => '44'
);

array( 
'44' => '44',
'55' => '55',
'66' => '66',
'77' => '77'
);

これらの2つの配列を組み合わせて、重複が含まれないようにし、元のキーを保持したいと思います。たとえば、出力は次のようになります。

array( 
'11' => '11',
'22' => '22',
'33' => '33',
'44' => '44',
'55' => '55',
'66' => '66',
'77' => '77'
);

私はこれを試しましたが、元のキーが変更されています。

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

解決策はありますか?

回答:


161

使用するだけ:

$output = array_merge($array1, $array2);

それはそれを解決するはずです。('44'例のように)1つのキーが複数回発生する場合は文字列キーを使用するため、1つのキーが同じ名前の後続のキーを上書きします。あなたの場合、どちらも同じ値を持っているので、それは問題ではなく、重複も削除されます。

更新:PHPは数値の文字列キーを数字(整数)として扱うため、このように動作することに気づきました。つまり、キーの番号も付け直します...

回避策は、キーを再作成することです。

$output = array_combine($output, $output);

更新2:演算子もあることを常に忘れています(これは本当にあなたが探しているものなので、太字で!:D)

$output = $array1 + $array2;

これらすべては、http//php.net/manual/en/function.array-merge.phpで見ることができます。


5
@ KingCrunch-数字は引用符で囲まれてますが文字列キーではないため、インデックスは保持されません。例:ideone.com/I2NFT
Brendan Bullen

1
ほんとに…最初は「バグ」について話したかったのですが、マニュアルでは「整数キー」ではなく「数字キー」しか話していないことに気づきました。少し混乱します。
KingCrunch 2011年

+1オペレーターのことを忘れました!すばらしい(その部分を太字で示してください!;))
Brendan Bullen 2011年

3
だから、$array1 + $array2代わりに短いかつ効率的なソリューションであるarray_merge() - array_combine()組み合わせが
アワン

2
警告!非$a + $b != array_merge($a, $b)
関連付け

33

あなたはそれを考慮に入れるべきです $array1 + $array2 != $array2 + $array1

$array1 = array(
'11' => 'x1',
'22' => 'x1' 
);  

$array2 = array(
'22' => 'x2',
'33' => 'x2' 
);

$配列1 + $配列2

$array1 + $array2 = array(
'11' => 'x1',
'22' => 'x1',
'33' => 'x2'
);

そして$ array2 + $ array1で

$array2 + $array1 = array(  
'11' => 'x1',  
'22' => 'x2',  
'33' => 'x2'  
);

25

これは機能します:

$output = $array1 + $array2;

12
動作が非常に直感的でないため、これはお勧めしません。例[1,2,3] + [4,5,6] == [1,2,3]
jchook 2016年

@jchookでは、何をお勧めしますか?
michas 2016年

これが私が必要としていたものです、ありがとう。理由は次のとおりです。http_build_query(array_merge($array1, $array2))私には機能しませんでしたが、機能しましhttp_build_query($array1 + $array2)た。
BarryMode 2017

4

これを行うには、一方をループしてもう一方に追加します。

<?php

$test1 = array( 
'11' => '11',
'22' => '22',
'33' => '33',
'44' => '44'
);

$test2 = array( 
'44' => '44',
'55' => '55',
'66' => '66',
'77' => '77'
);


function combineWithKeys($array1, $array2)
{
    foreach($array1 as $key=>$value) $array2[$key] = $value;
    asort($array2);
    return $array2;
} 

print_r(combineWithKeys($test1, $test2));

?>

更新: KingCrunchは最良の解決策を考え出しました:print_r($array1+$array2);


2

PHP 7.4以降を使用している場合は...、PHPドキュメントの次の例としてspread演算子を使用できます。

$arr1 = [1, 2, 3];
$arr2 = [...$arr1]; //[1, 2, 3]
$arr3 = [0, ...$arr1]; //[0, 1, 2, 3]
$arr4 = array(...$arr1, ...$arr2, 111); //[1, 2, 3, 1, 2, 3, 111]
$arr5 = [...$arr1, ...$arr1]; //[1, 2, 3, 1, 2, 3]

function getArr() {
  return ['a', 'b'];
}
$arr6 = [...getArr(), 'c']; //['a', 'b', 'c']

$arr7 = [...new ArrayIterator(['a', 'b', 'c'])]; //['a', 'b', 'c']

function arrGen() {
    for($i = 11; $i < 15; $i++) {
        yield $i;
    }
}
$arr8 = [...arrGen()]; //[11, 12, 13, 14]

JavaScriptES6と同じように機能します。

詳細については、https://wiki.php.net/rfc/spread_operator_for_arrayを参照してください


これは質問には当てはまりません。(スプレッドオペレータが離れてキーをスロー)OPは、配列の文字列キー(スプレッド演算子とそのdoesnの"トン作業)を有し、OPは、キーを保存したい。またOPが重複を望んでいない。。
マルッティ

ああ、私はあなたのポイントを見る。それは本当です、そしてあなたは正しいです。他の人への私の答えを改善するのに役立つコードを提供できますか?お時間をいただきありがとうございます!私の答えの欠点を指摘してくれてありがとう。
科学の学生

スプレッド演算子がここに行く方法ではないと思います。代わりに、与えられた答えを使用してください$array1 + $array2
martti

私はこれに気づいていませんでした!つまり、私たちにできることを知りません$ouput = $array1 + $array2でした。今、私は何か新しいことを学びました!ありがとうございました!
科学の学生

1

これは機能します:

$a = array(1 => 1, 2 => 2, 3 => 3);
$b = array(4 => 4, 5 => 5, 6 => 6);
$c = $a + $b;
print_r($c);

1

警告!$ array1 + $ array2はキーを上書きするので、私の解決策(多次元配列の場合)はarray_unique()を使用することです

array_unique(array_merge($a, $b), SORT_REGULAR);

通知:

5.2.10+のデフォルト値sort_flagsをSORT_STRINGに戻しました。

5.2.9 デフォルトはSORT_REGULARです。

5.2.8-デフォルトはSORT_STRINGです

それは完全に機能します。それが同じように役立つことを願っています。


1
array_merge()ただし、キーは保持されません。それによって作成された配列には0のインデックスが付けられます。
HPierce 2017年

@HPierceまあ、多次元配列加算の場合、を使用すると一部の情報が失われ+ます。見てみましょう:PHPFiddle、$ B [0]が失われてしまいます...
ノーマンEdance

1

php7.4でそれを行う新しい方法はSpread演算子です[...]

$parts = ['apple', 'pear'];
$fruits = ['banana', 'orange', ...$parts, 'watermelon'];
var_dump($fruits);

スプレッド演算子は、よりも優れたパフォーマンスを持つ必要があります array_merge

Spread演算子の重要な利点は、トラバース可能なオブジェクトをサポートするのに対し、array_merge関数は配列のみをサポートすることです。


弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.