【问题标题】:PHP combine two associative arrays into one arrayPHP 将两个关联数组合并为一个数组
【发布时间】:2012-10-21 15:16:21
【问题描述】:
$array1 = array("$name1" => "$id1");

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

我需要一个将所有内容组合在一起的新数组,即

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

最好的方法是什么?

抱歉,我忘记了,id 永远不会相互匹配,但从技术上讲,名称可以,但不太可能,它们都需要列在一个数组中。我查看了 array_merge 但不确定这是否是最好的方法。另外,您将如何对此进行单元测试?

【问题讨论】:

  • 听起来你可能只是在寻找 array_merge。
  • 我认为最好的方法是,如果你知道键都是不同的,那就是使用 += 运算符: $array1 += $array2;这会将 $array2 的所有元素附加到 $array1 的末尾。

标签: php arrays multidimensional-array associative-array


【解决方案1】:

查看array_merge()

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

【讨论】:

  • @SudhanshuSaxena 考虑到我是第一个发布它的人,我不明白它怎么可能是重复的答案。
【解决方案2】:

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"
    }

【讨论】:

  • array_merge 比使用操作符有什么好处?
  • 数组联合 (+):+ 运算符将剩余键的元素从右手数组附加到左手,而重复的键不会被覆盖。 array_merge():如果输入数组具有相同的字符串键,则该键的后一个值将覆盖前一个。但是,如果数组包含数字键,则后面的值不会覆盖原始值,而是会被追加。如果所有的数组都只包含数字键,则生成的数组被赋予从零开始递增的键。
  • 还需要注意的是,array_merge 将返回 NULL,如果任何参数为 NULL。
  • 如果有整数键,那么它们将被更改为从 0 开始的整数键。使用 array_merge 时要非常小心。最好使用 foreach 循环来做你想做的事情。
【解决方案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);
    }
}

【讨论】:

    【解决方案4】:

    还有array_replace,其中一个原始数组被其他数组修改,保留key => value关联而不创建重复键。

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

    【讨论】:

    • 这是正确答案。如果您有数字键,array_merge 将不起作用(所有键都将转换为一致的索引)。
    【解决方案5】:

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

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

    这就是我想出的 PDO 查询连接两个表的方法。塞缪尔·库克(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>';
    

    也许这会帮助其他人。

    【讨论】:

      【解决方案6】:

      更新 只是一个简短的说明,我可以看到这看起来非常愚蠢,并且它对纯 PHP 没有什么用处,因为 array_merge 只是在那里工作。但是在你急于投反对票之前,请尝试使用 PHP MongoDB 驱动程序。那个家伙会出于任何原因添加索引,并且会破坏合并的对象。使用我幼稚的小功能,合并的结果与传统的array_merge 完全一样。


      我知道这是一个老问题,但我想再添加一个我最近遇到的关于 MongoDB 驱动程序查询的案例,而 array_mergearray_replacearray_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;
      }
      

      【讨论】:

        【解决方案7】:
                $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

        【讨论】:

          猜你喜欢
          • 2018-04-27
          • 2013-06-19
          • 1970-01-01
          • 2010-11-15
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2019-08-11
          • 2012-11-01
          相关资源
          最近更新 更多