PHPは2つの連想配列を1つの配列に結合します


85
$array1 = array("$name1" => "$id1");

$array2 = array("$name2" => "$id2", "$name3" => "$id3");

すべてを組み合わせた新しいアレイが必要です。

$array3 = array("$name1" => "$id1", "$name2" => "$id2", "$name3" => "$id3");

これを行うための最良の方法は何ですか?

申し訳ありませんが、IDが互いに一致することはありませんが、技術的には名前は一致する可能性がありますが、一致する可能性は低く、すべてを1つの配列にリストする必要があります。array_mergeを調べましたが、それがこれを行うための最良の方法であるかどうかはわかりませんでした。また、これをどのように単体テストしますか?


5
おそらくarray_mergeを探しているだけのようです。
コービン2012年

キーがすべて異なることがわかっている場合、最善の方法は+ =演算子を使用することだと思います。$ array1 + = $ array2; これにより、$ array2のすべての要素が$ array1の末尾に追加されます。
デビッドスペクター

回答:


127

array_merge() より効率的ですが、いくつかのオプションがあります。

$array1 = array("id1" => "value1");

$array2 = array("id2" => "value2", "id3" => "value3", "id4" => "value4");

$array3 = array_merge($array1, $array2/*, $arrayN, $arrayN*/);
$array4 = $array1 + $array2;

echo '<pre>';
var_dump($array3);
var_dump($array4);
echo '</pre>';


// Results:
    array(4) {
      ["id1"]=>
      string(6) "value1"
      ["id2"]=>
      string(6) "value2"
      ["id3"]=>
      string(6) "value3"
      ["id4"]=>
      string(6) "value4"
    }
    array(4) {
      ["id1"]=>
      string(6) "value1"
      ["id2"]=>
      string(6) "value2"
      ["id3"]=>
      string(6) "value3"
      ["id4"]=>
      string(6) "value4"
    }

7
演算子を使用するよりもarray_mergeの利点は何ですか?
jsteinmann 2012年

37
配列ユニオン(+):+演算子は、残りのキーの要素を右利きの配列から左利きの配列に追加しますが、重複したキーは上書きされません。array_merge():入力配列に同じ文字列キーがある場合、そのキーの新しい値が前の値を上書きします。ただし、配列に数値キーが含まれている場合、後の値は元の値を上書きしませんが、追加されます。すべての配列に数値キーのみが含まれている場合、結果の配列にはゼロから始まる増分キーが与えられます。
サミュエルクック

12
array_merge引数のいずれかがNULLの場合、NULLを返すことにも注意してください。
SeanWM 2014年

4
整数キーがある場合は、0から始まる整数キーに変更されます。array_mergeには十分注意してください。foreachループを使用して、実行しようとしていることを実行することをお勧めします。
user2850305 2017

24

チェックアウトarray_merge()

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

22
@SudhanshuSaxena私が最初に投稿したことを考えると、それがどのように繰り返しの答えになるのかわかりません。
ブラッド

10

またarray_replace、元の配列が他の配列によって変更され、重複するキーを作成せずにキー=>値の関連付けが保持される場合もあります。

  • 他の配列で同じキーを使用すると、値が元の配列を上書きします
  • 他のアレイの新しいキーは、元のアレイに作成されます

1
これが正解です。数値キーがある場合、array_mergeは機能しません(すべてのキーが一貫したインデックスに変換されます)。
ドミトリー

3

array_mergeのラッパーを使用して、null配列に関するSeanWMのコメントを処理します。また、重複を取り除きたい場合もあります。また、新しい配列を作成するのではなく、一般的に1つの配列を別の配列にマージしたいと思っています。これは次のようになります。

/**
 * Merge two arrays - but if one is blank or not an array, return the other.
 * @param $a array First array, into which the second array will be merged
 * @param $b array Second array, with the data to be merged
 * @param $unique boolean If true, remove duplicate values before returning
 */
function arrayMerge(&$a, $b, $unique = false) {
    if (empty($b)) {
        return;  // No changes to be made to $a
    }
    if (empty($a)) {
        $a = $b;
        return;
    }
    $a = array_merge($a, $b);
    if ($unique) {
        $a = array_unique($a);
    }
}

2
        $array = array(
            22 => true,
            25 => true,
            34 => true,
            35 => true,
        );

        print_r(
            array_replace($array, [
                22 => true,
                42 => true,
            ])
        );

        print_r(
            array_merge($array, [
                22 => true,
                42 => true,
            ])
        );

数値であるが順次連想配列ではない場合は、を使用する必要があります array_replace


0

2つのassoc配列を結合するクリーンな方法を特定しようとして、この質問に出くわしました。

相互に関係のない2つの異なるテーブルを結合しようとしていました。

これは、2つのテーブルを結合するPDOクエリについて私が思いついたものです。サミュエル・クックはarray_merge()、彼への+1で私のための解決策を特定したものです。

        $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
        $sql = "SELECT * FROM ".databaseTbl_Residential_Prospects."";
        $ResidentialData = $pdo->prepare($sql);
        $ResidentialData->execute(array($lapi));
        $ResidentialProspects = $ResidentialData->fetchAll(PDO::FETCH_ASSOC);

        $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
        $sql = "SELECT * FROM ".databaseTbl_Commercial_Prospects."";
        $CommercialData = $pdo->prepare($sql);
        $CommercialData->execute(array($lapi));
        $CommercialProspects = $CommercialData->fetchAll(PDO::FETCH_ASSOC);

        $Prospects = array_merge($ResidentialProspects,$CommercialProspects);
        echo '<pre>';
        var_dump($Prospects);
        echo '</pre>';

多分これは他の誰かを助けるでしょう。


0

更新 これは本当にばかげているように見えますが、純粋なPHPではうまく機能しないため、簡単array_mergeに説明します。ただし、急いで反対票を投じる前に、PHPMongoDBドライバーで試してみてください。その男は何らかの理由でインデックスを追加し、マージされたオブジェクトを台無しにします。私の素朴な小さな機能で、マージは従来のとまったく同じように行われarray_mergeます。


私はそれが古い質問です知っているが、私はMongoDBのドライバクエリとのどれで最近持っていたもう一つのケースを追加したいarray_mergearray_replaceでもarray_push働いていました。配列内の配列としてラップされたオブジェクトの少し複雑な構造がありました:

$a = [
 ["a" => [1, "a2"]],
 ["b" => ["b1", 2]]
];
$t = [
 ["c" => ["c1", "c2"]],
 ["b" => ["b1", 2]]
];

そして、私はこれらを次のような同じ構造を維持しながらマージする必要がありました:

$merged = [
 ["a" => [1, "a2"]],
 ["b" => ["b1", 2]],
 ["c" => ["c1", "c2"]],
 ["b" => ["b1", 2]]
];

私が思いついた最良の解決策はこれでした:

public static function glueArrays($arr1, $arr2) {
    // merges TWO (2) arrays without adding indexing. 
    $myArr = $arr1;
    foreach ($arr2 as $arrayItem) {
        $myArr[] = $arrayItem;
    }
    return $myArr;
}
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.