PHP将两个关联数组合并为一个数组


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

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

我需要一个将所有元​​素组合在一起的新数组,即

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

做这个的最好方式是什么?

对不起,我忘了,这些ID永远不会匹配,但从技术上讲,这些名称可能会出现,但不可能出现,它们都必须列在一个数组中。我查看了array_merge,但不确定这是否是最佳方法。另外,您将如何对此进行单元测试?


5
听起来您可能只是在寻找array_merge。
科尔宾

我认为最好的方法是使用+ =运算符:$ array1 + = $ array2; 这会将$ array2的所有元素追加到$ array1的末尾。
David Spector

Answers:


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

37
数组并集(+):+运算符将右手数组中剩余键的元素附加到左手数组,而重复的键不会被覆盖。array_merge():如果输入数组具有相同的字符串键,则该键的后一个值将覆盖前一个。但是,如果数组包含数字键,则后面的值将不会覆盖原始值,而是将其附加。如果所有数组仅包含数字键,则为结果数组提供从零开始的递增键。
塞缪尔·库克

12
还应注意,array_merge如果任何参数为NULL ,则将返回NULL。
SeanWM 2014年

4
如果有整数键,则将它们更改为从0开始的整数键。使用array_merge时要格外小心。最好使用foreach循环来执行您要执行的操作。
user2850305

24

结帐array_merge()

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

22
@SudhanshuSaxena考虑到我是第一个发布它的人,我不知道它怎么可能是重复的答案。
Brad 2015年

10

还有array_replace,其中原始数组由其他数组修改,保留了key => value关联,而没有创建重复的键。

  • 其他阵列上的相同键将导致值覆盖原始阵列
  • 其他阵列上的新键将在原始阵列上创建

1
这是正确的答案。如果您拥有数字键,array_merge将不起作用(所有键都将转换为一致的索引)。
德米特里(Dmitry)

3

我在array_merge周围使用包装器来处理SeanWM关于空数组的评论;我有时也想摆脱重复。我通常也想将一个数组合并到另一个数组中,而不是创建一个新数组。最终结果为:

/**
 * 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

我偶然发现了这个问题,试图找出一种干净的方法来连接两个assoc数组。

我试图加入两个彼此没有关系的不同表。

这是我为连接两个表的PDO Query想到的。塞缪尔·库克(Samuel Cook)为他确定了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那工作。但是在急于降低投票率之前,请尝试使用PHP MongoDB驱动程序进行尝试。该家伙将出于任何原因添加索引,并且将破坏合并的对象。借助我朴素的功能,合并完全按照传统方式进行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;
}
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.