web-dev-qa-db-ja.com

2つの配列を組み合わせる

このような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 ) );

解決策はありますか?

74
Awan

ただ使用する:

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

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

更新:私は、PHPが数値文字列キーを数字(整数)として扱うので、このように振る舞う、つまり、キーの番号を付け直します...

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

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

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

$output = $array1 + $array2;

このすべては、次の場所にあります。 http://php.net/manual/en/function.array-merge.php

140
KingCrunch

$array1 + $array2 != $array2 + $array1を考慮する必要があります

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

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

$ array1 +$ array2

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

$ array2+ $ array1

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

これは動作します:

$output = $array1 + $array2;
24
Michas

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

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

?>

UPDATE:KingCrunchは ベストソリューションprint_r($array1+$array2);を思いつきました

4
Brendan Bullen

これは動作します:

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

警告! $ 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
Norman Edance

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

$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]

JavaScript ES6のように機能します。

https://wiki.php.net/rfc/spread_operator_for_array の詳細を参照してください。

1

https://www.php.net/manual/en/function.array-merge.php

<?php
$array1 = array("color" => "red", 2, 4);
$array2 = array("a", "b", "color" => "green", "shape" => "trapezoid", 4);
$result = array_merge($array1, $array2);
print_r($result);
?>
0